packages feed

papa-0.4.0: src/Papa/Base/Control/Monad.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -Wall #-}

module Papa.Base.Control.Monad (
  Functor (fmap),
  Monad ((>>=), return, (>>)),
  MonadFail (fail),
  MonadFix (mfix),
  MonadPlus (mzero, mplus),
  MonadZip (mzip, mzipWith, munzip),
  forever,
  msum,
  mfilter,
  filterM,
  foldM,
  foldM_,
  replicateM,
  replicateM_,
  guard,
  when,
  unless,
  (<$!>),
  anyM,
  allM,
  findM,
) where

import Control.Monad (
  Functor (fmap),
  Monad (return, (>>), (>>=)),
  MonadFail (fail),
  MonadPlus (mplus, mzero),
  filterM,
  foldM,
  foldM_,
  forever,
  guard,
  mfilter,
  msum,
  replicateM,
  replicateM_,
  unless,
  when,
  (<$!>),
 )
import Control.Monad.Fix as P (
  MonadFix (mfix),
 )
import Control.Monad.Zip as P (
  MonadZip (mzip, mzipWith, munzip),
 )

import Data.Bool (Bool (False, True))
import Data.Maybe (Maybe (Just, Nothing))

{-# INLINE anyM #-}
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

{-# INLINE allM #-}
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

{-# INLINE findM #-}
-- | Find an element satisfying a predicate
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