module Gamgine.Control where
import Data.Bool.HT (if')

whenM :: Monad m => m Bool -> m () -> m ()
whenM :: forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
whenM m Bool
p m ()
m = do
   Bool
r <- m Bool
p
   if Bool
r then m ()
m else () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()


-- | if a is just than apply f, otherwise 'return ()'
ifJust :: Monad m => Maybe a -> (a -> m ()) -> m ()
ifJust :: forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
ifJust (Just a
a) a -> m ()
f = a -> m ()
f a
a
ifJust Maybe a
_        a -> m ()
_ = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- | apply f on a if p is true, otherwise just return a
applyIf :: (a -> Bool) -> (a -> a) -> a -> a
applyIf :: forall a. (a -> Bool) -> (a -> a) -> a -> a
applyIf a -> Bool
p a -> a
f a
a | a -> Bool
p a
a       = a -> a
f a
a
              | Bool
otherwise = a
a

-- | apply f on a if p is true, otherwise 'return ()'
applyIfM :: Monad m => (a -> Bool) -> (a -> m ()) -> a -> m ()
applyIfM :: forall (m :: * -> *) a.
Monad m =>
(a -> Bool) -> (a -> m ()) -> a -> m ()
applyIfM a -> Bool
p a -> m ()
f a
a | a -> Bool
p a
a       = a -> m ()
f a
a
               | Bool
otherwise = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()


(?) :: Bool -> a -> a -> a
? :: forall a. Bool -> a -> a -> a
(?) = Bool -> a -> a -> a
forall a. Bool -> a -> a -> a
if'
infixl 1 ?