{-# LANGUAGE CPP #-}
module Control.Monad.Loops
( module Control.Monad.Loops
) where
import Control.Monad
import Control.Exception
import Control.Concurrent
#ifndef base4
#define SomeException Exception
#endif
forkMapM :: (a -> IO b) -> [a] -> IO [Either SomeException b]
forkMapM :: forall a b. (a -> IO b) -> [a] -> IO [Either SomeException b]
forkMapM a -> IO b
f [a]
xs = do
[MVar (Either SomeException b)]
mvars <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [a]
xs forall a b. (a -> b) -> a -> b
$ \a
x -> do
MVar (Either SomeException b)
mvar <- forall a. IO (MVar a)
newEmptyMVar
IO () -> IO ThreadId
forkIO forall a b. (a -> b) -> a -> b
$ do
Either SomeException b
result <- forall e a. Exception e => (e -> IO a) -> IO a -> IO a
handle (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> Either a b
Left) forall a b. (a -> b) -> a -> b
$ do
b
y <- a -> IO b
f a
x
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a b. b -> Either a b
Right b
y)
forall a. MVar a -> a -> IO ()
putMVar MVar (Either SomeException b)
mvar Either SomeException b
result
forall (m :: * -> *) a. Monad m => a -> m a
return MVar (Either SomeException b)
mvar
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall a. MVar a -> IO a
takeMVar [MVar (Either SomeException b)]
mvars
forkMapM_ :: (a -> IO b) -> [a] -> IO [Maybe SomeException]
forkMapM_ :: forall a b. (a -> IO b) -> [a] -> IO [Maybe SomeException]
forkMapM_ a -> IO b
f [a]
xs = do
[MVar (Maybe SomeException)]
mvars <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [a]
xs forall a b. (a -> b) -> a -> b
$ \a
x -> do
MVar (Maybe SomeException)
mvar <- forall a. IO (MVar a)
newEmptyMVar
IO () -> IO ThreadId
forkIO forall a b. (a -> b) -> a -> b
$ do
let handleAny :: (SomeException -> IO a) -> IO a -> IO a
handleAny :: forall a. (SomeException -> IO a) -> IO a -> IO a
handleAny = forall e a. Exception e => (e -> IO a) -> IO a -> IO a
handle
Maybe SomeException
result <- forall a. (SomeException -> IO a) -> IO a -> IO a
handleAny (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> Maybe a
Just) forall a b. (a -> b) -> a -> b
$ do
a -> IO b
f a
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
forall a. MVar a -> a -> IO ()
putMVar MVar (Maybe SomeException)
mvar Maybe SomeException
result
forall (m :: * -> *) a. Monad m => a -> m a
return MVar (Maybe SomeException)
mvar
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall a. MVar a -> IO a
takeMVar [MVar (Maybe SomeException)]
mvars
forkMapM__ :: (a -> IO b) -> [a] -> IO ()
forkMapM__ :: forall a b. (a -> IO b) -> [a] -> IO ()
forkMapM__ a -> IO b
f [a]
xs = do
[MVar ()]
mvars <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [a]
xs forall a b. (a -> b) -> a -> b
$ \a
x -> do
MVar ()
mvar <- forall a. IO (MVar a)
newEmptyMVar
IO () -> IO ThreadId
forkIO forall a b. (a -> b) -> a -> b
$ do
let handleAny :: (SomeException -> IO a) -> IO a -> IO a
handleAny :: forall a. (SomeException -> IO a) -> IO a -> IO a
handleAny = forall e a. Exception e => (e -> IO a) -> IO a -> IO a
handle
forall a. (SomeException -> IO a) -> IO a -> IO a
handleAny (\SomeException
_ -> forall (m :: * -> *) a. Monad m => a -> m a
return ()) forall a b. (a -> b) -> a -> b
$ do
a -> IO b
f a
x
forall (m :: * -> *) a. Monad m => a -> m a
return ()
forall a. MVar a -> a -> IO ()
putMVar MVar ()
mvar ()
forall (m :: * -> *) a. Monad m => a -> m a
return MVar ()
mvar
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ forall a. MVar a -> IO a
takeMVar [MVar ()]
mvars
{-# SPECIALIZE whileM :: IO Bool -> IO a -> IO [a] #-}
{-# SPECIALIZE whileM' :: Monad m => m Bool -> m a -> m [a] #-}
{-# SPECIALIZE whileM' :: IO Bool -> IO a -> IO [a] #-}
{-# SPECIALIZE whileM_ :: IO Bool -> IO a -> IO () #-}
whileM :: Monad m => m Bool -> m a -> m [a]
whileM :: forall (m :: * -> *) a. Monad m => m Bool -> m a -> m [a]
whileM = forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m Bool -> m a -> m (f a)
whileM'
whileM' :: (Monad m, MonadPlus f) => m Bool -> m a -> m (f a)
whileM' :: forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m Bool -> m a -> m (f a)
whileM' m Bool
p m a
f = m (f a)
go
where go :: m (f a)
go = do
Bool
x <- m Bool
p
if Bool
x
then do
a
x <- m a
f
f a
xs <- m (f a)
go
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (m :: * -> *) a. Monad m => a -> m a
return a
x forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` f a
xs)
else forall (m :: * -> *) a. Monad m => a -> m a
return forall (m :: * -> *) a. MonadPlus m => m a
mzero
whileM_ :: (Monad m) => m Bool -> m a -> m ()
whileM_ :: forall (m :: * -> *) a. Monad m => m Bool -> m a -> m ()
whileM_ m Bool
p m a
f = m ()
go
where go :: m ()
go = do
Bool
x <- m Bool
p
if Bool
x
then m a
f forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> m ()
go
else forall (m :: * -> *) a. Monad m => a -> m a
return ()
iterateWhile :: Monad m => (a -> Bool) -> m a -> m a
iterateWhile :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> m a -> m a
iterateWhile a -> Bool
p = forall (m :: * -> *) a. Monad m => (a -> Bool) -> m a -> m a
iterateUntil (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p)
{-# SPECIALIZE iterateM_ :: (a -> IO a) -> a -> IO b #-}
iterateM_ :: Monad m => (a -> m a) -> a -> m b
iterateM_ :: forall (m :: * -> *) a b. Monad m => (a -> m a) -> a -> m b
iterateM_ a -> m a
f = forall {b}. a -> m b
g
where g :: a -> m b
g a
x = a -> m a
f a
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> m b
g
{-# SPECIALIZE untilM :: IO a -> IO Bool -> IO [a] #-}
{-# SPECIALIZE untilM' :: Monad m => m a -> m Bool -> m [a] #-}
{-# SPECIALIZE untilM' :: IO a -> IO Bool -> IO [a] #-}
{-# SPECIALIZE untilM_ :: IO a -> IO Bool -> IO () #-}
infixr 0 `untilM`
infixr 0 `untilM'`
infixr 0 `untilM_`
infixr 0 `iterateUntilM`
untilM :: Monad m => m a -> m Bool -> m [a]
untilM :: forall (m :: * -> *) a. Monad m => m a -> m Bool -> m [a]
untilM = forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m a -> m Bool -> m (f a)
untilM'
untilM' :: (Monad m, MonadPlus f) => m a -> m Bool -> m (f a)
m a
f untilM' :: forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m a -> m Bool -> m (f a)
`untilM'` m Bool
p = do
a
x <- m a
f
f a
xs <- forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m Bool -> m a -> m (f a)
whileM' (forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Bool -> Bool
not m Bool
p) m a
f
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (m :: * -> *) a. Monad m => a -> m a
return a
x forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` f a
xs)
untilM_ :: (Monad m) => m a -> m Bool -> m ()
m a
f untilM_ :: forall (m :: * -> *) a. Monad m => m a -> m Bool -> m ()
`untilM_` m Bool
p = m a
f forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall (m :: * -> *) a. Monad m => m Bool -> m a -> m ()
whileM_ (forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Bool -> Bool
not m Bool
p) m a
f
iterateUntilM :: (Monad m) => (a -> Bool) -> (a -> m a) -> a -> m a
iterateUntilM :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> (a -> m a) -> a -> m a
iterateUntilM a -> Bool
p a -> m a
f a
v
| a -> Bool
p a
v = forall (m :: * -> *) a. Monad m => a -> m a
return a
v
| Bool
otherwise = a -> m a
f a
v forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> (a -> m a) -> a -> m a
iterateUntilM a -> Bool
p a -> m a
f
iterateUntil :: Monad m => (a -> Bool) -> m a -> m a
iterateUntil :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> m a -> m a
iterateUntil a -> Bool
p m a
x = m a
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> (a -> m a) -> a -> m a
iterateUntilM a -> Bool
p (forall a b. a -> b -> a
const m a
x)
{-# SPECIALIZE whileJust :: IO (Maybe a) -> (a -> IO b) -> IO [b] #-}
{-# SPECIALIZE whileJust' :: Monad m => m (Maybe a) -> (a -> m b) -> m [b] #-}
{-# SPECIALIZE whileJust' :: IO (Maybe a) -> (a -> IO b) -> IO [b] #-}
{-# SPECIALIZE whileJust_ :: IO (Maybe a) -> (a -> IO b) -> IO () #-}
whileJust :: Monad m => m (Maybe a) -> (a -> m b) -> m [b]
whileJust :: forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> (a -> m b) -> m [b]
whileJust = forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, MonadPlus f) =>
m (Maybe a) -> (a -> m b) -> m (f b)
whileJust'
whileJust' :: (Monad m, MonadPlus f) => m (Maybe a) -> (a -> m b) -> m (f b)
whileJust' :: forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, MonadPlus f) =>
m (Maybe a) -> (a -> m b) -> m (f b)
whileJust' m (Maybe a)
p a -> m b
f = m (f b)
go
where go :: m (f b)
go = do
Maybe a
x <- m (Maybe a)
p
case Maybe a
x of
Maybe a
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall (m :: * -> *) a. MonadPlus m => m a
mzero
Just a
x -> do
b
x <- a -> m b
f a
x
f b
xs <- m (f b)
go
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (m :: * -> *) a. Monad m => a -> m a
return b
x forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` f b
xs)
whileJust_ :: (Monad m) => m (Maybe a) -> (a -> m b) -> m ()
whileJust_ :: forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> (a -> m b) -> m ()
whileJust_ m (Maybe a)
p a -> m b
f = m ()
go
where go :: m ()
go = do
Maybe a
x <- m (Maybe a)
p
case Maybe a
x of
Maybe a
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just a
x -> do
a -> m b
f a
x
m ()
go
untilJust :: Monad m => m (Maybe a) -> m a
untilJust :: forall (m :: * -> *) a. Monad m => m (Maybe a) -> m a
untilJust m (Maybe a)
m = m a
go
where
go :: m a
go = do
Maybe a
x <- m (Maybe a)
m
case Maybe a
x of
Maybe a
Nothing -> m a
go
Just a
x -> forall (m :: * -> *) a. Monad m => a -> m a
return a
x
{-# SPECIALIZE unfoldM :: IO (Maybe a) -> IO [a] #-}
{-# SPECIALIZE unfoldM' :: (Monad m) => m (Maybe a) -> m [a] #-}
{-# SPECIALIZE unfoldM' :: IO (Maybe a) -> IO [a] #-}
{-# SPECIALIZE unfoldM_ :: IO (Maybe a) -> IO () #-}
unfoldM :: (Monad m) => m (Maybe a) -> m [a]
unfoldM :: forall (m :: * -> *) a. Monad m => m (Maybe a) -> m [a]
unfoldM = forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m (Maybe a) -> m (f a)
unfoldM'
unfoldM' :: (Monad m, MonadPlus f) => m (Maybe a) -> m (f a)
unfoldM' :: forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
m (Maybe a) -> m (f a)
unfoldM' m (Maybe a)
m = forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, MonadPlus f) =>
m (Maybe a) -> (a -> m b) -> m (f b)
whileJust' m (Maybe a)
m forall (m :: * -> *) a. Monad m => a -> m a
return
unfoldM_ :: (Monad m) => m (Maybe a) -> m ()
unfoldM_ :: forall (m :: * -> *) a. Monad m => m (Maybe a) -> m ()
unfoldM_ m (Maybe a)
m = forall (m :: * -> *) a b.
Monad m =>
m (Maybe a) -> (a -> m b) -> m ()
whileJust_ m (Maybe a)
m forall (m :: * -> *) a. Monad m => a -> m a
return
unfoldWhileM :: Monad m => (a -> Bool) -> m a -> m [a]
unfoldWhileM :: forall (m :: * -> *) a. Monad m => (a -> Bool) -> m a -> m [a]
unfoldWhileM a -> Bool
p m a
m = forall {b}. ([a] -> b) -> m b
loop forall a. a -> a
id
where
loop :: ([a] -> b) -> m b
loop [a] -> b
f = do
a
x <- m a
m
if a -> Bool
p a
x
then ([a] -> b) -> m b
loop ([a] -> b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
xforall a. a -> [a] -> [a]
:))
else forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> b
f [])
unfoldWhileM' :: (Monad m, MonadPlus f) => (a -> Bool) -> m a -> m (f a)
unfoldWhileM' :: forall (m :: * -> *) (f :: * -> *) a.
(Monad m, MonadPlus f) =>
(a -> Bool) -> m a -> m (f a)
unfoldWhileM' a -> Bool
p m a
m = forall {m :: * -> *}. MonadPlus m => m a -> m (m a)
loop forall (m :: * -> *) a. MonadPlus m => m a
mzero
where
loop :: m a -> m (m a)
loop m a
xs = do
a
x <- m a
m
if a -> Bool
p a
x
then m a -> m (m a)
loop (m a
xs forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` forall (m :: * -> *) a. Monad m => a -> m a
return a
x)
else forall (m :: * -> *) a. Monad m => a -> m a
return m a
xs
{-# SPECIALIZE unfoldrM :: (a -> IO (Maybe (b,a))) -> a -> IO [b] #-}
{-# SPECIALIZE unfoldrM' :: (Monad m) => (a -> m (Maybe (b,a))) -> a -> m [b] #-}
{-# SPECIALIZE unfoldrM' :: (a -> IO (Maybe (b,a))) -> a -> IO [b] #-}
unfoldrM :: (Monad m) => (a -> m (Maybe (b,a))) -> a -> m [b]
unfoldrM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m (Maybe (b, a))) -> a -> m [b]
unfoldrM = forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, MonadPlus f) =>
(a -> m (Maybe (b, a))) -> a -> m (f b)
unfoldrM'
unfoldrM' :: (Monad m, MonadPlus f) => (a -> m (Maybe (b,a))) -> a -> m (f b)
unfoldrM' :: forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, MonadPlus f) =>
(a -> m (Maybe (b, a))) -> a -> m (f b)
unfoldrM' a -> m (Maybe (b, a))
f = forall {m :: * -> *}. MonadPlus m => a -> m (m b)
go
where go :: a -> m (m b)
go a
z = do
Maybe (b, a)
x <- a -> m (Maybe (b, a))
f a
z
case Maybe (b, a)
x of
Maybe (b, a)
Nothing -> forall (m :: * -> *) a. Monad m => a -> m a
return forall (m :: * -> *) a. MonadPlus m => m a
mzero
Just (b
x, a
z') -> do
m b
xs <- a -> m (m b)
go a
z'
forall (m :: * -> *) a. Monad m => a -> m a
return (forall (m :: * -> *) a. Monad m => a -> m a
return b
x forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` m b
xs)
{-# SPECIALIZE concatM :: [a -> IO a] -> (a -> IO a) #-}
concatM :: (Monad m) => [a -> m a] -> (a -> m a)
concatM :: forall (m :: * -> *) a. Monad m => [a -> m a] -> a -> m a
concatM [a -> m a]
fs = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
(>=>) forall (m :: * -> *) a. Monad m => a -> m a
return [a -> m a]
fs
{-# SPECIALIZE andM :: [IO Bool] -> IO Bool #-}
{-# SPECIALIZE orM :: [IO Bool] -> IO Bool #-}
andM :: (Monad m) => [m Bool] -> m Bool
andM :: forall (m :: * -> *). Monad m => [m Bool] -> m Bool
andM [] = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
andM (m Bool
p:[m Bool]
ps) = do
Bool
q <- m Bool
p
if Bool
q
then forall (m :: * -> *). Monad m => [m Bool] -> m Bool
andM [m Bool]
ps
else forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
orM :: (Monad m) => [m Bool] -> m Bool
orM :: forall (m :: * -> *). Monad m => [m Bool] -> m Bool
orM [] = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
orM (m Bool
p:[m Bool]
ps) = do
Bool
q <- m Bool
p
if Bool
q
then forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
else forall (m :: * -> *). Monad m => [m Bool] -> m Bool
orM [m Bool]
ps
{-# SPECIALIZE anyPM :: [a -> IO Bool] -> (a -> IO Bool) #-}
{-# SPECIALIZE allPM :: [a -> IO Bool] -> (a -> IO Bool) #-}
anyPM :: (Monad m) => [a -> m Bool] -> (a -> m Bool)
anyPM :: forall (m :: * -> *) a. Monad m => [a -> m Bool] -> a -> m Bool
anyPM [] a
_ = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
anyPM (a -> m Bool
p:[a -> m Bool]
ps) a
x = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
else forall (m :: * -> *) a. Monad m => [a -> m Bool] -> a -> m Bool
anyPM [a -> m Bool]
ps a
x
allPM :: (Monad m) => [a -> m Bool] -> (a -> m Bool)
allPM :: forall (m :: * -> *) a. Monad m => [a -> m Bool] -> a -> m Bool
allPM [] a
_ = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
allPM (a -> m Bool
p:[a -> m Bool]
ps) a
x = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then forall (m :: * -> *) a. Monad m => [a -> m Bool] -> a -> m Bool
allPM [a -> m Bool]
ps a
x
else forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
{-# SPECIALIZE anyM :: (a -> IO Bool) -> [a] -> IO Bool #-}
{-# SPECIALIZE allM :: (a -> IO Bool) -> [a] -> IO Bool #-}
anyM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool
anyM :: forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM a -> m Bool
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
anyM a -> m Bool
p (a
x:[a]
xs) = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
else forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
anyM a -> m Bool
p [a]
xs
allM :: (Monad m) => (a -> m Bool) -> [a] -> m Bool
allM :: forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
allM a -> m Bool
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
allM a -> m Bool
p (a
x:[a]
xs) = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m Bool
allM a -> m Bool
p [a]
xs
else forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
takeWhileM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
takeWhileM :: forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
takeWhileM a -> m Bool
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return []
takeWhileM a -> m Bool
p (a
x:[a]
xs) = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then (forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
takeWhileM a -> m Bool
p [a]
xs) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. (:) a
x)
else forall (m :: * -> *) a. Monad m => a -> m a
return []
dropWhileM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
dropWhileM :: forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
dropWhileM a -> m Bool
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return []
dropWhileM a -> m Bool
p (a
x:[a]
xs) = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
dropWhileM a -> m Bool
p [a]
xs
else forall (m :: * -> *) a. Monad m => a -> m a
return (a
xforall a. a -> [a] -> [a]
:[a]
xs)
trimM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
trimM :: forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
trimM a -> m Bool
p [a]
xs = do
[a]
xs <- forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
dropWhileM a -> m Bool
p [a]
xs
[a]
rxs <- forall (m :: * -> *) a. Monad m => (a -> m Bool) -> [a] -> m [a]
dropWhileM a -> m Bool
p (forall a. [a] -> [a]
reverse [a]
xs)
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. [a] -> [a]
reverse [a]
rxs)
firstM :: (Monad m) => (a -> m Bool) -> [a] -> m (Maybe a)
firstM :: forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> [a] -> m (Maybe a)
firstM a -> m Bool
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
firstM a -> m Bool
p (a
x:[a]
xs) = do
Bool
q <- a -> m Bool
p a
x
if Bool
q
then forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
x)
else forall (m :: * -> *) a.
Monad m =>
(a -> m Bool) -> [a] -> m (Maybe a)
firstM a -> m Bool
p [a]
xs
{-# INLINE minimaOnByM #-}
minimaOnByM :: Monad m => (a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
minimaOnByM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
minimaOnByM a -> m b
_ b -> b -> m Ordering
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return []
minimaOnByM a -> m b
f b -> b -> m Ordering
cmp (a
x:[a]
xs) = do
b
fx<- a -> m b
f a
x
([a] -> [a]) -> b -> [a] -> m [a]
loop (a
xforall a. a -> [a] -> [a]
:) b
fx [a]
xs
where loop :: ([a] -> [a]) -> b -> [a] -> m [a]
loop [a] -> [a]
ms b
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> [a]
ms [])
loop [a] -> [a]
ms b
fm (a
x:[a]
xs) = do
b
fx <- a -> m b
f a
x
Ordering
ord <- b -> b -> m Ordering
cmp b
fm b
fx
case Ordering
ord of
Ordering
LT -> ([a] -> [a]) -> b -> [a] -> m [a]
loop [a] -> [a]
ms b
fm [a]
xs
Ordering
EQ -> ([a] -> [a]) -> b -> [a] -> m [a]
loop ([a] -> [a]
ms forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
xforall a. a -> [a] -> [a]
:)) b
fm [a]
xs
Ordering
GT -> ([a] -> [a]) -> b -> [a] -> m [a]
loop (a
xforall a. a -> [a] -> [a]
:) b
fx [a]
xs
{-# INLINE maximaOnByM #-}
maximaOnByM :: Monad m => (a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
maximaOnByM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
maximaOnByM a -> m b
f = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
minimaOnByM a -> m b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> b -> a -> c
flip
minimaByM :: Monad m => (a -> a -> m Ordering) -> [a] -> m [a]
minimaByM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> [a] -> m [a]
minimaByM = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
minimaOnByM forall (m :: * -> *) a. Monad m => a -> m a
return
maximaByM :: Monad m => (a -> a -> m Ordering) -> [a] -> m [a]
maximaByM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> [a] -> m [a]
maximaByM = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
maximaOnByM forall (m :: * -> *) a. Monad m => a -> m a
return
minimaOnM :: (Monad m, Ord b) => (a -> m b) -> [a] -> m [a]
minimaOnM :: forall (m :: * -> *) b a.
(Monad m, Ord b) =>
(a -> m b) -> [a] -> m [a]
minimaOnM a -> m b
f = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
minimaOnByM a -> m b
f (\b
x b
y -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Ord a => a -> a -> Ordering
compare b
x b
y))
maximaOnM :: (Monad m, Ord b) => (a -> m b) -> [a] -> m [a]
maximaOnM :: forall (m :: * -> *) b a.
(Monad m, Ord b) =>
(a -> m b) -> [a] -> m [a]
maximaOnM a -> m b
f = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m [a]
maximaOnByM a -> m b
f (\b
x b
y -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Ord a => a -> a -> Ordering
compare b
x b
y))
{-# INLINE minimumOnByM #-}
minimumOnByM :: Monad m => (a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
minimumOnByM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
minimumOnByM a -> m b
_ b -> b -> m Ordering
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
minimumOnByM a -> m b
f b -> b -> m Ordering
cmp (a
x:[a]
xs) = do
b
fx <- a -> m b
f a
x
a -> b -> [a] -> m (Maybe a)
loop a
x b
fx [a]
xs
where loop :: a -> b -> [a] -> m (Maybe a)
loop a
m b
_ [] = forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
m)
loop a
m b
fm (a
x:[a]
xs) = do
b
fx <- a -> m b
f a
x
Ordering
ord <- b -> b -> m Ordering
cmp b
fm b
fx
case Ordering
ord of
Ordering
LT -> a -> b -> [a] -> m (Maybe a)
loop a
m b
fm [a]
xs
Ordering
EQ -> a -> b -> [a] -> m (Maybe a)
loop a
m b
fm [a]
xs
Ordering
GT -> a -> b -> [a] -> m (Maybe a)
loop a
x b
fx [a]
xs
{-# INLINE maximumOnByM #-}
maximumOnByM :: Monad m => (a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
maximumOnByM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
maximumOnByM a -> m b
f = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
minimumOnByM a -> m b
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> b -> a -> c
flip
minimumByM :: Monad m => (a -> a -> m Ordering) -> [a] -> m (Maybe a)
minimumByM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> [a] -> m (Maybe a)
minimumByM = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
minimumOnByM forall (m :: * -> *) a. Monad m => a -> m a
return
maximumByM :: Monad m => (a -> a -> m Ordering) -> [a] -> m (Maybe a)
maximumByM :: forall (m :: * -> *) a.
Monad m =>
(a -> a -> m Ordering) -> [a] -> m (Maybe a)
maximumByM = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
maximumOnByM forall (m :: * -> *) a. Monad m => a -> m a
return
minimumOnM :: (Monad m, Ord b) => (a -> m b) -> [a] -> m (Maybe a)
minimumOnM :: forall (m :: * -> *) b a.
(Monad m, Ord b) =>
(a -> m b) -> [a] -> m (Maybe a)
minimumOnM a -> m b
f = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
minimumOnByM a -> m b
f (\b
x b
y -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Ord a => a -> a -> Ordering
compare b
x b
y))
maximumOnM :: (Monad m, Ord b) => (a -> m b) -> [a] -> m (Maybe a)
maximumOnM :: forall (m :: * -> *) b a.
(Monad m, Ord b) =>
(a -> m b) -> [a] -> m (Maybe a)
maximumOnM a -> m b
f = forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> (b -> b -> m Ordering) -> [a] -> m (Maybe a)
maximumOnByM a -> m b
f (\b
x b
y -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Ord a => a -> a -> Ordering
compare b
x b
y))