module Papa.Base.Implement.Data.Bool(
if'
, (?.)
, (.?)
, (?<>)
, (<>?)
, (?<*>)
, (<*>?)
, (<||>)
, (<&&>)
) where
import Control.Applicative(Applicative(pure))
import Control.Category(Category(id))
import Control.Monad(Monad)
import Data.Bool(Bool(False, True), not)
import Data.Monoid
if' ::
Bool
-> a
-> a
-> a
if' True t _ =
t
if' False _ f =
f
(?.) ::
Category c =>
c a a
-> Bool
-> c a a
f ?. False =
f
_ ?. True =
id
(.?) ::
Category c =>
c a a
-> Bool
-> c a a
(.?) x y =
(?.) x (not y)
(?<>) ::
Monoid a =>
a
-> Bool
-> a
f ?<> False =
f
_ ?<> True =
mempty
(<>?) ::
Monoid a =>
a
-> Bool
-> a
(<>?) x y =
(?<>) x (not y)
(?<*>) ::
Applicative f =>
(a -> f a)
-> Bool
-> a
-> f a
f ?<*> False =
f
_ ?<*> True =
pure
(<*>?) ::
Applicative f =>
(a -> f a)
-> Bool
-> a
-> f a
(<*>?) x y =
(?<*>) x (not y)
(<||>) ::
Monad m =>
m Bool ->
m Bool ->
m Bool
p <||> q =
do p' <- p
if p'
then
pure True
else
q
(<&&>) ::
Monad m =>
m Bool ->
m Bool ->
m Bool
p <&&> q =
do p' <- p
if p'
then
q
else
pure False