{-# LANGUAGE CPP #-} {-# LANGUAGE Trustworthy #-} {-# LANGUAGE NoImplicitPrelude #-} module Protolude.Monad ( Monad((>>=), return) , MonadPlus(mzero, mplus) , (=<<) , (>=>) , (<=<) , (>>) , forever , join , mfilter , filterM , mapAndUnzipM , zipWithM , zipWithM_ , foldM , foldM_ , replicateM , replicateM_ , concatMapM , guard , when , unless , liftM , liftM2 , liftM3 , liftM4 , liftM5 , liftM' , liftM2' , ap , (<$!>) ) where import Protolude.Base (seq) import Data.List (concat) import Control.Monad concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b] concatMapM :: (a -> m [b]) -> [a] -> m [b] concatMapM a -> m [b] f [a] xs = ([[b]] -> [b]) -> m [[b]] -> m [b] forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftM [[b]] -> [b] forall (t :: * -> *) a. Foldable t => t [a] -> [a] concat ((a -> m [b]) -> [a] -> m [[b]] forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) mapM a -> m [b] f [a] xs) liftM' :: Monad m => (a -> b) -> m a -> m b liftM' :: (a -> b) -> m a -> m b liftM' = (a -> b) -> m a -> m b forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r (<$!>) {-# INLINE liftM' #-} liftM2' :: (Monad m) => (a -> b -> c) -> m a -> m b -> m c liftM2' :: (a -> b -> c) -> m a -> m b -> m c liftM2' a -> b -> c f m a a m b b = do a x <- m a a b y <- m b b let z :: c z = a -> b -> c f a x b y c z c -> m c -> m c `seq` c -> m c forall (m :: * -> *) a. Monad m => a -> m a return c z {-# INLINE liftM2' #-} #if !MIN_VERSION_base(4,8,0) (<$!>) :: Monad m => (a -> b) -> m a -> m b f <$!> m = do x <- m let z = f x z `seq` return z {-# INLINE (<$!>) #-} #endif