{-# LANGUAGE Arrows #-}
module FRP.Dunai.LTLPast where
import Control.Monad.Trans.MSF.Maybe (MaybeT, catchMaybe, inMaybeT)
import Data.MonadicStreamFunction (MSF, arr, feedback, iPre, liftTransS,
returnA, (&&&), (>>>), (^>>))
andSF :: Monad m => MSF m (Bool, Bool) Bool
andSF :: forall (m :: * -> *). Monad m => MSF m (Bool, Bool) Bool
andSF = ((Bool, Bool) -> Bool) -> MSF m (Bool, Bool) Bool
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr ((Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(&&))
orSF :: Monad m => MSF m (Bool, Bool) Bool
orSF :: forall (m :: * -> *). Monad m => MSF m (Bool, Bool) Bool
orSF = ((Bool, Bool) -> Bool) -> MSF m (Bool, Bool) Bool
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr ((Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(||))
notSF :: Monad m => MSF m Bool Bool
notSF :: forall (m :: * -> *). Monad m => MSF m Bool Bool
notSF = (Bool -> Bool) -> MSF m Bool Bool
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr Bool -> Bool
not
impliesSF :: Monad m => MSF m (Bool, Bool) Bool
impliesSF :: forall (m :: * -> *). Monad m => MSF m (Bool, Bool) Bool
impliesSF = ((Bool, Bool) -> Bool) -> MSF m (Bool, Bool) Bool
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (((Bool, Bool) -> Bool) -> MSF m (Bool, Bool) Bool)
-> ((Bool, Bool) -> Bool) -> MSF m (Bool, Bool) Bool
forall a b. (a -> b) -> a -> b
$ \(Bool
i, Bool
p) -> Bool -> Bool
not Bool
i Bool -> Bool -> Bool
|| Bool
p
sofarSF :: Monad m => MSF m Bool Bool
sofarSF :: forall (m :: * -> *). Monad m => MSF m Bool Bool
sofarSF = Bool -> MSF m (Bool, Bool) (Bool, Bool) -> MSF m Bool Bool
forall (m :: * -> *) c a b.
Monad m =>
c -> MSF m (a, c) (b, c) -> MSF m a b
feedback Bool
True (MSF m (Bool, Bool) (Bool, Bool) -> MSF m Bool Bool)
-> MSF m (Bool, Bool) (Bool, Bool) -> MSF m Bool Bool
forall a b. (a -> b) -> a -> b
$ ((Bool, Bool) -> (Bool, Bool)) -> MSF m (Bool, Bool) (Bool, Bool)
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (((Bool, Bool) -> (Bool, Bool)) -> MSF m (Bool, Bool) (Bool, Bool))
-> ((Bool, Bool) -> (Bool, Bool))
-> MSF m (Bool, Bool) (Bool, Bool)
forall a b. (a -> b) -> a -> b
$ \(Bool
n, Bool
o) -> let n' :: Bool
n' = Bool
o Bool -> Bool -> Bool
&& Bool
n in (Bool
n', Bool
n')
everSF :: Monad m => MSF m Bool Bool
everSF :: forall (m :: * -> *). Monad m => MSF m Bool Bool
everSF = Bool -> MSF m (Bool, Bool) (Bool, Bool) -> MSF m Bool Bool
forall (m :: * -> *) c a b.
Monad m =>
c -> MSF m (a, c) (b, c) -> MSF m a b
feedback Bool
False (MSF m (Bool, Bool) (Bool, Bool) -> MSF m Bool Bool)
-> MSF m (Bool, Bool) (Bool, Bool) -> MSF m Bool Bool
forall a b. (a -> b) -> a -> b
$ ((Bool, Bool) -> (Bool, Bool)) -> MSF m (Bool, Bool) (Bool, Bool)
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (((Bool, Bool) -> (Bool, Bool)) -> MSF m (Bool, Bool) (Bool, Bool))
-> ((Bool, Bool) -> (Bool, Bool))
-> MSF m (Bool, Bool) (Bool, Bool)
forall a b. (a -> b) -> a -> b
$ \(Bool
n, Bool
o) -> let n' :: Bool
n' = Bool
o Bool -> Bool -> Bool
|| Bool
n in (Bool
n', Bool
n')
untilSF :: (Functor m, Monad m) => MSF m (Bool, Bool) Bool
untilSF :: forall (m :: * -> *).
(Functor m, Monad m) =>
MSF m (Bool, Bool) Bool
untilSF =
MSF (MaybeT m) (Bool, Bool) Bool
-> MSF m (Bool, Bool) Bool -> MSF m (Bool, Bool) Bool
forall (m :: * -> *) a b.
(Functor m, Monad m) =>
MSF (MaybeT m) a b -> MSF m a b -> MSF m a b
catchMaybe (MSF m (Bool, Bool) (Bool, Bool) -> MSF (MaybeT m) (Bool, Bool) Bool
forall (m :: * -> *) a b.
Monad m =>
MSF m a (b, Bool) -> MSF (MaybeT m) a b
untilMaybeB (Bool
-> MSF m ((Bool, Bool), Bool) ((Bool, Bool), Bool)
-> MSF m (Bool, Bool) (Bool, Bool)
forall (m :: * -> *) c a b.
Monad m =>
c -> MSF m (a, c) (b, c) -> MSF m a b
feedback Bool
True (MSF m ((Bool, Bool), Bool) ((Bool, Bool), Bool)
-> MSF m (Bool, Bool) (Bool, Bool))
-> MSF m ((Bool, Bool), Bool) ((Bool, Bool), Bool)
-> MSF m (Bool, Bool) (Bool, Bool)
forall a b. (a -> b) -> a -> b
$ (((Bool, Bool), Bool) -> ((Bool, Bool), Bool))
-> MSF m ((Bool, Bool), Bool) ((Bool, Bool), Bool)
forall b c. (b -> c) -> MSF m b c
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr ((Bool, Bool), Bool) -> ((Bool, Bool), Bool)
cond))
((Bool, Bool) -> Bool
forall a b. (a, b) -> b
snd ((Bool, Bool) -> Bool)
-> MSF m Bool Bool -> MSF m (Bool, Bool) Bool
forall (a :: * -> * -> *) b c d.
Arrow a =>
(b -> c) -> a c d -> a b d
^>> MSF m Bool Bool
forall (m :: * -> *). Monad m => MSF m Bool Bool
sofarSF)
where
untilMaybeB :: Monad m => MSF m a (b, Bool) -> MSF (MaybeT m) a b
untilMaybeB :: forall (m :: * -> *) a b.
Monad m =>
MSF m a (b, Bool) -> MSF (MaybeT m) a b
untilMaybeB MSF m a (b, Bool)
msf = proc a
a -> do
(b
b, Bool
c) <- MSF m a (b, Bool) -> MSF (MaybeT m) a (b, Bool)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
(MonadTrans t, Monad m, Monad (t m)) =>
MSF m a b -> MSF (t m) a b
liftTransS MSF m a (b, Bool)
msf -< a
a
MSF (MaybeT m) (Maybe b) b
forall (m :: * -> *) a. Monad m => MSF (MaybeT m) (Maybe a) a
inMaybeT -< if Bool
c then Maybe b
forall a. Maybe a
Nothing else b -> Maybe b
forall a. a -> Maybe a
Just b
b
cond :: ((Bool, Bool), Bool) -> ((Bool, Bool), Bool)
cond ((Bool
i, Bool
u), Bool
o) = ((Bool
n, Bool
o Bool -> Bool -> Bool
&& Bool
u), Bool
n)
where
n :: Bool
n = Bool
o Bool -> Bool -> Bool
&& Bool
i
lastSF :: Monad m => MSF m Bool Bool
lastSF :: forall (m :: * -> *). Monad m => MSF m Bool Bool
lastSF = Bool -> MSF m Bool Bool
forall (m :: * -> *) a. Monad m => a -> MSF m a a
iPre Bool
False
type SPred m a = MSF m a Bool