{-# LANGUAGE CPP #-}
module Data.Bool.Extras
(
bool
, mwhen
, mwhenM
, whenA
, whenC
, whenM
, BoolAlgebra
, cata
, ana
) where
import Control.Arrow
import Control.Category (Category)
import qualified Control.Category as Cat
import Control.Monad
import Data.Bool
import Data.Monoid
#if !MIN_VERSION_base(4,7,0)
{-# INLINE bool #-}
bool :: a -> a -> Bool -> a
bool x _ False = x
bool _ y True = y
#endif
mwhen :: (Monoid a) => a -> Bool -> a
mwhen :: forall a. Monoid a => a -> Bool -> a
mwhen = a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool a
forall a. Monoid a => a
mempty
mwhenM :: (Monad m, Monoid a) => m a -> Bool -> m a
mwhenM :: forall (m :: * -> *) a. (Monad m, Monoid a) => m a -> Bool -> m a
mwhenM = m a -> m a -> Bool -> m a
forall a. a -> a -> Bool -> a
bool (a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
forall a. Monoid a => a
mempty)
whenA :: (Arrow a) => a b b -> Bool -> a b b
whenA :: forall (a :: * -> * -> *) b. Arrow a => a b b -> Bool -> a b b
whenA = a b b -> a b b -> Bool -> a b b
forall a. a -> a -> Bool -> a
bool a b b
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA
whenC :: (Category cat) => cat a a -> Bool -> cat a a
whenC :: forall (cat :: * -> * -> *) a.
Category cat =>
cat a a -> Bool -> cat a a
whenC = cat a a -> cat a a -> Bool -> cat a a
forall a. a -> a -> Bool -> a
bool cat a a
forall a. cat a a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
Cat.id
whenM :: (Monad m) => (a -> m a) -> Bool -> (a -> m a)
whenM :: forall (m :: * -> *) a. Monad m => (a -> m a) -> Bool -> a -> m a
whenM = (a -> m a) -> (a -> m a) -> Bool -> a -> m a
forall a. a -> a -> Bool -> a
bool a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
type BoolAlgebra r = (r, r)
cata :: BoolAlgebra r -> Bool -> r
cata :: forall r. BoolAlgebra r -> Bool -> r
cata (r
x, r
_) Bool
False = r
x
cata (r
_, r
y) Bool
True = r
y
ana :: (b -> Bool) -> b -> Bool
ana :: forall b. (b -> Bool) -> b -> Bool
ana b -> Bool
f b
b = b -> Bool
f b
b