
module Data.Util where

import Language.Haskell.TH
--showAsSet :: (Show a) => [a] -> String

showAsSet :: (Show a) => [a] -> ShowS
showAsSet l = showString "{  " .
            (if null l then id else
                 shows (head l) . foldr (\s r -> showString " , " . shows s . r) (showChar ' ') (tail l)) .
            showChar '}'
 
showAssoc (l,r) =	showString "\n  " . (shows l) . (showString " ->  ") . (shows r)

showAsPairFlipped (l,r) = showAssoc (r,l)
                  
cpsfold _ a [] = a
cpsfold f a (x:xs) = f x a (\y -> cpsfold f y xs)

printQ :: (Ppr a, Show a) => Q a -> IO ()
printQ q = runQ q >>= putStrLn . pprint
showQ :: (Show a) => Q a -> IO ()
showQ q = runQ q >>= putStrLn . show

insertAt :: Int -> a -> [a] -> [a]
insertAt 0 a xs     = a:xs
insertAt _ a []     = [a]
insertAt i a (x:xs) = x:(insertAt (i-1) a xs)
                    