{-# OPTIONS -Wall -Werror #-} module Graphics.Transform.Magick.Util( allM, butLast, assertM, commaSep, groups) where import Data.List import GHC.IOBase ------------------ -- Monad utilities ------------------ allM :: Monad m => (a -> m Bool) -> [a] -> m Bool allM f xs = mapM f xs >>= (return . and) assertM :: Bool -> String -> IO () assertM True _ = return () assertM False s = throwIO (AssertionFailed s) ----------------- -- List utilities ----------------- -- returns an empty list if passed the empty list butLast :: [a] -> [a] butLast = reverse.safeTail.reverse safeTail :: [a] -> [a] safeTail [] = [] safeTail (_:xs) = xs sepBy :: [a] -> [[a]] -> [a] sepBy separator things = concat (intersperse separator things) commaSep :: Show a => [a] -> String commaSep xs = sepBy "," (map show xs) groups :: Integral a => a -> [b] -> [[b]] groups n xs | genericLength xs <= n = [xs] groups n xss = (genericTake n xss):(groups n (genericDrop n xss))