{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Monad.ToolsYj where

import Control.Monad.Fix
import Data.Bool

whenDef :: Applicative m => a -> Bool -> m a -> m a
whenDef :: forall (m :: * -> *) a. Applicative m => a -> Bool -> m a -> m a
whenDef = (m a -> Bool -> m a) -> Bool -> m a -> m a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((m a -> Bool -> m a) -> Bool -> m a -> m a)
-> (a -> m a -> Bool -> m a) -> a -> Bool -> m a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> m a -> Bool -> m a
forall a. a -> a -> Bool -> a
bool (m a -> m a -> Bool -> m a)
-> (a -> m a) -> a -> m a -> Bool -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> m a
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure

whenMaybe :: Applicative m => Maybe a -> (a -> m ()) -> m ()
whenMaybe :: forall (m :: * -> *) a.
Applicative m =>
Maybe a -> (a -> m ()) -> m ()
whenMaybe = ((a -> m ()) -> Maybe a -> m ()) -> Maybe a -> (a -> m ()) -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip (((a -> m ()) -> Maybe a -> m ())
 -> Maybe a -> (a -> m ()) -> m ())
-> (m () -> (a -> m ()) -> Maybe a -> m ())
-> m ()
-> Maybe a
-> (a -> m ())
-> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m () -> (a -> m ()) -> Maybe a -> m ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (m () -> Maybe a -> (a -> m ()) -> m ())
-> m () -> Maybe a -> (a -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ () -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

whenMaybeDef :: Applicative m => b -> Maybe a -> (a -> m b) -> m b
whenMaybeDef :: forall (m :: * -> *) b a.
Applicative m =>
b -> Maybe a -> (a -> m b) -> m b
whenMaybeDef = ((a -> m b) -> Maybe a -> m b) -> Maybe a -> (a -> m b) -> m b
forall a b c. (a -> b -> c) -> b -> a -> c
flip (((a -> m b) -> Maybe a -> m b) -> Maybe a -> (a -> m b) -> m b)
-> (b -> (a -> m b) -> Maybe a -> m b)
-> b
-> Maybe a
-> (a -> m b)
-> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m b -> (a -> m b) -> Maybe a -> m b
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (m b -> (a -> m b) -> Maybe a -> m b)
-> (b -> m b) -> b -> (a -> m b) -> Maybe a -> m b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> m b
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure

doWhile_ :: Monad m => m Bool -> m ()
doWhile_ :: forall (m :: * -> *). Monad m => m Bool -> m ()
doWhile_ m Bool
a = (m () -> m ()) -> m ()
forall a. (a -> a) -> a
fix ((m () -> m ()) -> m ()) -> (m () -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ (m Bool
a m Bool -> (Bool -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=) ((Bool -> m ()) -> m ()) -> (m () -> Bool -> m ()) -> m () -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m () -> m () -> Bool -> m ()
forall a. a -> a -> Bool -> a
bool (() -> m ()
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ())