module Control.Monad.TM
(
(.=<<.)
, (.>>=.)
, anyM
, allM
, findM
) where
import Control.Applicative
import Data.Traversable
import Control.Monad
(.=<<.) ::
(Applicative q, Monad m, Traversable m) =>
(a -> q (m b))
-> m a
-> q (m b)
(.=<<.) f =
fmap join . traverse f
(.>>=.) ::
(Applicative q, Monad m, Traversable m) =>
m a
-> (a -> q (m b))
-> q (m b)
(.>>=.) =
flip (.=<<.)
anyM ::
Monad m =>
(a -> m Bool)
-> [a]
-> m Bool
anyM _ [] =
return False
anyM f (a:as) =
do z <- f a
if z
then return True
else anyM f as
allM ::
Monad m =>
(a -> m Bool)
-> [a]
-> m Bool
allM _ [] =
return True
allM f (a:as) =
do z <- f a
if z
then allM f as
else return False
findM ::
Monad m =>
(a -> m Bool)
-> [a]
-> m (Maybe a)
findM _ [] =
return Nothing
findM f (x:xs) =
do b <- f x
if b
then
return (Just x)
else
findM f xs