From 57edbbf2f407433ffb55996a6c2cafbd65bca4fc Mon Sep 17 00:00:00 2001 From: Gary Burgess Date: Fri, 30 Sep 2016 12:26:45 +0100 Subject: [PATCH] Add whenM and unlessM --- src/Control/Monad.purs | 17 +++++++++++++++++ src/Prelude.purs | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Control/Monad.purs b/src/Control/Monad.purs index b548721d..497c7c71 100644 --- a/src/Control/Monad.purs +++ b/src/Control/Monad.purs @@ -2,6 +2,8 @@ module Control.Monad ( class Monad , liftM1 , ap + , whenM + , unlessM , module Data.Functor , module Control.Apply , module Control.Applicative @@ -13,6 +15,7 @@ import Control.Apply (class Apply, apply, (*>), (<*), (<*>)) import Control.Bind (class Bind, bind, ifM, join, (<=<), (=<<), (>=>), (>>=)) import Data.Functor (class Functor, map, void, ($>), (<#>), (<$), (<$>)) +import Data.Unit (Unit) -- | The `Monad` type class combines the operations of the `Bind` and -- | `Applicative` type classes. Therefore, `Monad` instances represent type @@ -61,3 +64,17 @@ ap f a = do f' <- f a' <- a pure (f' a') + +-- | Perform a monadic action when a condition is true, where the conditional +-- | value is also in a monadic context. +whenM :: forall m. Monad m => m Boolean -> m Unit -> m Unit +whenM mb m = do + b <- mb + when b m + +-- | Perform a monadic action unless a condition is true, where the conditional +-- | value is also in a monadic context. +unlessM :: forall m. Monad m => m Boolean -> m Unit -> m Unit +unlessM mb m = do + b <- mb + unless b m diff --git a/src/Prelude.purs b/src/Prelude.purs index d6813c98..0484a9c6 100644 --- a/src/Prelude.purs +++ b/src/Prelude.purs @@ -30,7 +30,7 @@ import Control.Applicative (class Applicative, pure, liftA1, unless, when) import Control.Apply (class Apply, apply, (*>), (<*), (<*>)) import Control.Bind (class Bind, bind, ifM, join, (<=<), (=<<), (>=>), (>>=)) import Control.Category (class Category, id) -import Control.Monad (class Monad, ap, liftM1) +import Control.Monad (class Monad, ap, liftM1, unlessM, whenM) import Control.Semigroupoid (class Semigroupoid, compose, (<<<), (>>>)) import Data.Boolean (otherwise)