module Utils ( splitOn
             , splitWith
             , groupsOf
             )
where

splitOn :: (Eq a) => a -> [a] -> [[a]]
splitOn = splitWith . (==)

splitWith ::  (a -> Bool) -> [a] -> [[a]]
splitWith f s =  case dropWhile f s of
                   [] -> []
                   s' -> w : splitWith f s''
                       where (w, s'') = break f s'

groupsOf n [] = []
groupsOf n xs = let (pre,xs') = splitAt n xs
                in pre : groupsOf n xs'