module Data.Maybe.JustIf (
	justIf,
	whenJust, whenJustM
	) where

import Control.Monad

-- | Return @Just@ if True
justIf :: a -> Bool -> Maybe a
a
x justIf :: a -> Bool -> Maybe a
`justIf` Bool
True = a -> Maybe a
forall a. a -> Maybe a
Just a
x
a
_ `justIf` Bool
False = Maybe a
forall a. Maybe a
Nothing

-- | Calls function when value is @Just@
whenJust :: Applicative m => Maybe a -> (a -> m b) -> m ()
whenJust :: Maybe a -> (a -> m b) -> m ()
whenJust Maybe a
v a -> m b
fn = m () -> (a -> m ()) -> Maybe a -> m ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (() -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()) (m b -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m b -> m ()) -> (a -> m b) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m b
fn) Maybe a
v

-- | Calls function when monad returns @Just@
whenJustM :: Monad m => m (Maybe a) -> (a -> m b) -> m ()
whenJustM :: m (Maybe a) -> (a -> m b) -> m ()
whenJustM m (Maybe a)
mv a -> m b
fn = m (Maybe a)
mv m (Maybe a) -> (Maybe a -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Maybe a -> (a -> m b) -> m ()
forall (m :: * -> *) a b.
Applicative m =>
Maybe a -> (a -> m b) -> m ()
`whenJust` a -> m b
fn)