This repository was archived by the owner on Nov 1, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMonadUtil.hs
44 lines (32 loc) · 1.47 KB
/
MonadUtil.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
module MonadUtil where
(@@) :: (Monad m) => (a -> m b) -> (c -> m a) -> (c -> m b)
f @@ g = \ x -> g x >>= f
mapAndUnzipR :: (Monad m) => (a -> m (b,c)) -> [a] -> m ([b], [c])
mapAndUnzipR f xs = accumulateR (map f xs) >>= return . unzip
accumulateR :: (Monad m) => [m a] -> m [a]
accumulateR = foldr mcons (return [])
where mcons p q = q >>= \ xs -> p >>= \ x -> return (x:xs)
zipWithR :: (Monad m) => (a -> b -> m c) -> [a] -> [b] -> m [c]
zipWithR f xs ys = accumulateR (zipWith f xs ys)
sequenceL :: (Monad m) => [m a] -> m ()
sequenceL [] = return ()
sequenceL (x:xs) = x >> sequenceL xs
sequenceR :: (Monad m) => [m a] -> m ()
sequenceR [] = return ()
sequenceR (x:xs) = sequenceR xs >> x >> return ()
mapL :: (Monad m) => (a -> m b) -> ([a] -> m [b])
mapL f [] = return []
mapL f (x:xs) = f x >>= \ y -> mapL f xs >>= \ ys -> return (y:ys)
mapR :: (Monad m) => (a -> m b) -> ([a] -> m [b])
mapR f [] = return []
mapR f (x:xs) = mapR f xs >>= \ ys -> f x >>= \ y -> return (y:ys)
map_ :: (Monad m) => (a -> m b) -> ([a] -> m ())
map_ f [] = return ()
map_ f (x:xs) = f x >> map_ f xs
foldR :: (Monad m) => (a -> b -> m b) -> b -> [a] -> m b
foldR f a [] = return a
foldR f a (x:xs) = foldR f a xs >>= \y -> f x y
concatM :: MonadPlus m => [m a] -> m a
concatM = foldr (++) zero
done :: (Monad m) => m ()
done = return ()