packages feed

pang-a-lambda-0.2.0.0: Experiments/collisions/Control/Extra/Monad.hs

module Control.Extra.Monad where

import Control.Monad

whileLoopM :: Monad m => m a -> (a -> Bool) -> (a -> m ()) -> m ()
whileLoopM val cond act = r'
  where r' = do v <- val
                when (cond v) $ do
                  act v
                  whileLoopM val cond act

foldLoopM :: Monad m => a -> m b -> (b -> Bool) -> (a -> b -> m a) -> m a
foldLoopM val sense cond act = r'
  where r' = do s <- sense
                if cond s
                  then do
                      val' <- act val s
                      foldLoopM val' sense cond act
                  else return val