{-# LANGUAGE TypeApplications #-}
module Data.Recursive.Bool
( R
, getR
, module Data.Recursive.Bool
) where
import Data.Coerce
import Data.Monoid
import Data.Recursive.R.Internal
import Data.Recursive.R
import Data.Recursive.Propagator.P2
rTrue :: R Bool
rTrue :: R Bool
rTrue = forall a. HasPropagator a => a -> R a
mkR Bool
True
rFalse :: R Bool
rFalse :: R Bool
rFalse = forall a. HasPropagator a => a -> R a
mkR Bool
False
(&&&) :: R Bool -> R Bool -> R Bool
&&& :: R Bool -> R Bool -> R Bool
(&&&) = forall a b c.
(HasPropagator a, HasPropagator b, HasPropagator c) =>
(Prop a -> Prop b -> Prop c -> IO ()) -> R a -> R b -> R c
defR2 forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce forall a b. (a -> b) -> a -> b
$ \P2
p1 P2
p2 P2
p ->
P2 -> IO () -> IO ()
whenTop P2
p1 (P2 -> IO () -> IO ()
whenTop P2
p2 (P2 -> IO ()
setTop P2
p))
(|||) :: R Bool -> R Bool -> R Bool
||| :: R Bool -> R Bool -> R Bool
(|||) = forall a b c.
(HasPropagator a, HasPropagator b, HasPropagator c) =>
(Prop a -> Prop b -> Prop c -> IO ()) -> R a -> R b -> R c
defR2 forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce forall a b. (a -> b) -> a -> b
$ \P2
p1 P2
p2 P2
p -> do
P2 -> IO () -> IO ()
whenTop P2
p1 (P2 -> IO ()
setTop P2
p)
P2 -> IO () -> IO ()
whenTop P2
p2 (P2 -> IO ()
setTop P2
p)
rand :: [R Bool] -> R Bool
rand :: [R Bool] -> R Bool
rand = forall a b.
(HasPropagator a, HasPropagator b) =>
([Prop a] -> Prop b -> IO ()) -> [R a] -> R b
defRList forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce [P2] -> P2 -> IO ()
go
where
go :: [P2] -> P2 -> IO ()
go [] P2
p = P2 -> IO ()
setTop P2
p
go (P2
p':[P2]
ps) P2
p = P2 -> IO () -> IO ()
whenTop P2
p' ([P2] -> P2 -> IO ()
go [P2]
ps P2
p)
ror :: [R Bool] -> R Bool
ror :: [R Bool] -> R Bool
ror = forall a b.
(HasPropagator a, HasPropagator b) =>
([Prop a] -> Prop b -> IO ()) -> [R a] -> R b
defRList forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce forall a b. (a -> b) -> a -> b
$ \[P2]
ps P2
p ->
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ @[] (P2 -> P2 -> IO ()
`implies` P2
p) [P2]
ps
rnot :: R (Dual Bool) -> R Bool
rnot :: R (Dual Bool) -> R Bool
rnot = forall a b.
(HasPropagator a, HasPropagator b) =>
(Prop a -> Prop b -> IO ()) -> R a -> R b
defR1 forall a b. (a -> b) -> a -> b
$ coerce :: forall a b. Coercible a b => a -> b
coerce forall a b. (a -> b) -> a -> b
$ \P2
p1 P2
p -> do
P2 -> P2 -> IO ()
implies P2
p1 P2
p