projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add transitional rules for the alternative layout rule
[ghc-hetmet.git]
/
compiler
/
utils
/
MonadUtils.hs
diff --git
a/compiler/utils/MonadUtils.hs
b/compiler/utils/MonadUtils.hs
index
2064657
..
5e01a22
100644
(file)
--- a/
compiler/utils/MonadUtils.hs
+++ b/
compiler/utils/MonadUtils.hs
@@
-8,6
+8,8
@@
module MonadUtils
, MonadFix(..)
, MonadIO(..)
, MonadFix(..)
, MonadIO(..)
+
+ , ID, runID
, liftIO1, liftIO2, liftIO3, liftIO4
, liftIO1, liftIO2, liftIO3, liftIO4
@@
-18,9
+20,12
@@
module MonadUtils
, concatMapM
, mapMaybeM
, anyM, allM
, concatMapM
, mapMaybeM
, anyM, allM
- , foldlM, foldrM
+ , foldlM, foldlM_, foldrM
+ , maybeMapM
) where
) where
+import Outputable
+
----------------------------------------------------------------------------------------
-- Detection of available libraries
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
-- Detection of available libraries
----------------------------------------------------------------------------------------
@@
-42,6
+47,20
@@
import Control.Monad
import Control.Monad.Fix
----------------------------------------------------------------------------------------
import Control.Monad.Fix
----------------------------------------------------------------------------------------
+-- The ID monad
+----------------------------------------------------------------------------------------
+
+newtype ID a = ID a
+instance Monad ID where
+ return x = ID x
+ (ID x) >>= f = f x
+ _ >> y = y
+ fail s = panic s
+
+runID :: ID a -> a
+runID (ID x) = x
+
+----------------------------------------------------------------------------------------
-- MTL
----------------------------------------------------------------------------------------
-- MTL
----------------------------------------------------------------------------------------
@@
-145,7
+164,16
@@
allM f (b:bs) = (f b) >>= (\bv -> if bv then allM f bs else return False)
foldlM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
foldlM = foldM
foldlM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
foldlM = foldM
+-- | Monadic version of foldl that discards its result
+foldlM_ :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m ()
+foldlM_ = foldM_
+
-- | Monadic version of foldr
foldrM :: (Monad m) => (b -> a -> m a) -> a -> [b] -> m a
foldrM _ z [] = return z
foldrM k z (x:xs) = do { r <- foldrM k z xs; k x r }
-- | Monadic version of foldr
foldrM :: (Monad m) => (b -> a -> m a) -> a -> [b] -> m a
foldrM _ z [] = return z
foldrM k z (x:xs) = do { r <- foldrM k z xs; k x r }
+
+-- | Monadic version of fmap specialised for Maybe
+maybeMapM :: Monad m => (a -> m b) -> (Maybe a -> m (Maybe b))
+maybeMapM _ Nothing = return Nothing
+maybeMapM m (Just x) = liftM Just $ m x