, MonadFix(..)
, MonadIO(..)
+
+ , ID, runID
, liftIO1, liftIO2, liftIO3, liftIO4
-
+
+ , zipWith3M
, mapAndUnzipM, mapAndUnzip3M, mapAndUnzip4M
, mapAccumLM
, mapSndM
, concatMapM
, mapMaybeM
, anyM, allM
- , foldlM, foldrM
+ , foldlM, foldlM_, foldrM
+ , maybeMapM
) where
+import Outputable
+
----------------------------------------------------------------------------------------
-- Detection of available libraries
----------------------------------------------------------------------------------------
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
----------------------------------------------------------------------------------------
-- These are used throughout the compiler
----------------------------------------------------------------------------------------
+zipWith3M :: Monad m => (a -> b -> c -> m d) -> [a] -> [b] -> [c] -> m [d]
+zipWith3M _ [] _ _ = return []
+zipWith3M _ _ [] _ = return []
+zipWith3M _ _ _ [] = return []
+zipWith3M f (x:xs) (y:ys) (z:zs)
+ = do { r <- f x y z
+ ; rs <- zipWith3M f xs ys zs
+ ; return $ r:rs
+ }
+
-- | mapAndUnzipM for triples
mapAndUnzip3M :: Monad m => (a -> m (b,c,d)) -> [a] -> m ([b],[c],[d])
mapAndUnzip3M _ [] = return ([],[],[])
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 }
\ No newline at end of file
+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