fquery-0.2.1: Adelie/ListEx.hs
-- ListEx.hs
--
-- Extra list functions.
module Adelie.ListEx (
break2,
concatMapM,
digitsToInt,
dropTail,
dropUntilAfter,
foldMUntil,
pad
) where
import Char (digitToInt)
import Data.List (foldl')
import Monad (liftM)
----------------------------------------------------------------
break2 :: (a -> Bool) -> [a] -> ([a], [a])
break2 f l = (h, drop 1 t)
where (h, t) = break f l
concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM f xs = liftM concat $ mapM f xs
digitsToInt :: String -> Int
digitsToInt = foldl' (\ a b -> a*10 + digitToInt b) 0
dropTail :: Int -> [a] -> [a]
dropTail n s = take (length s-n) s
dropUntilAfter :: (a -> Bool) -> [a] -> [a]
dropUntilAfter f = dropWhile f . dropWhile (not.f)
foldMUntil :: Monad m => (a -> b -> m a) -> (a -> Bool) -> a -> [b] -> m a
foldMUntil _ _ a [] = return a
foldMUntil f g a (x:xs) = do
a' <- f a x
case g a' of
True -> return a'
False -> foldMUntil f g a' xs
pad :: Int -> a -> [a] -> [a]
pad n a str = take n (str ++ repeat a)