module FRP.Yampa (module X, SF, FutureSF, embed, reactimate) where
import Control.Monad.Reader (mapReaderT)
import Data.Functor.Identity (Identity, runIdentity)
import FRP.BearRiver as X hiding (FutureSF, SF, embed, loopPre,
reactimate)
import qualified FRP.BearRiver as BR
import FRP.BearRiver.Loop as X
type SF = BR.SF Identity
type FutureSF = BR.SF Identity
embed :: SF a b -> (a, [(DTime, Maybe a)]) -> [b]
embed :: forall a b. SF a b -> (a, [(DTime, Maybe a)]) -> [b]
embed SF a b
sf = Identity [b] -> [b]
forall a. Identity a -> a
runIdentity (Identity [b] -> [b])
-> ((a, [(DTime, Maybe a)]) -> Identity [b])
-> (a, [(DTime, Maybe a)])
-> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SF a b -> (a, [(DTime, Maybe a)]) -> Identity [b]
forall (m :: * -> *) a b.
Monad m =>
SF m a b -> (a, [(DTime, Maybe a)]) -> m [b]
BR.embed SF a b
sf
reactimate :: Monad m
=> m a
-> (Bool -> m (DTime, Maybe a))
-> (Bool -> b -> m Bool)
-> SF a b
-> m ()
reactimate :: forall (m :: * -> *) a b.
Monad m =>
m a
-> (Bool -> m (DTime, Maybe a))
-> (Bool -> b -> m Bool)
-> SF a b
-> m ()
reactimate m a
senseI Bool -> m (DTime, Maybe a)
sense Bool -> b -> m Bool
actuate SF a b
sf =
m a
-> (Bool -> m (DTime, Maybe a))
-> (Bool -> b -> m Bool)
-> SF m a b
-> m ()
forall (m :: * -> *) a b.
Monad m =>
m a
-> (Bool -> m (DTime, Maybe a))
-> (Bool -> b -> m Bool)
-> SF m a b
-> m ()
BR.reactimate m a
senseI Bool -> m (DTime, Maybe a)
sense Bool -> b -> m Bool
actuate (SF a b -> SF m a b
forall (m :: * -> *) a b. Monad m => SF a b -> SF m a b
foldIdentity SF a b
sf)
where
foldIdentity :: Monad m => SF a b -> BR.SF m a b
foldIdentity :: forall (m :: * -> *) a b. Monad m => SF a b -> SF m a b
foldIdentity = (forall c. ClockInfo Identity c -> ClockInfo m c)
-> MSF (ClockInfo Identity) a b -> MSF (ClockInfo m) a b
forall (m2 :: * -> *) (m1 :: * -> *) a b.
(Monad m2, Monad m1) =>
(forall c. m1 c -> m2 c) -> MSF m1 a b -> MSF m2 a b
morphS ((forall c. ClockInfo Identity c -> ClockInfo m c)
-> MSF (ClockInfo Identity) a b -> MSF (ClockInfo m) a b)
-> (forall c. ClockInfo Identity c -> ClockInfo m c)
-> MSF (ClockInfo Identity) a b
-> MSF (ClockInfo m) a b
forall a b. (a -> b) -> a -> b
$ (Identity c -> m c)
-> ReaderT DTime Identity c -> ReaderT DTime m c
forall (m :: * -> *) a (n :: * -> *) b r.
(m a -> n b) -> ReaderT r m a -> ReaderT r n b
mapReaderT ((Identity c -> m c)
-> ReaderT DTime Identity c -> ReaderT DTime m c)
-> (Identity c -> m c)
-> ReaderT DTime Identity c
-> ReaderT DTime m c
forall a b. (a -> b) -> a -> b
$ c -> m c
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (c -> m c) -> (Identity c -> c) -> Identity c -> m c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity c -> c
forall a. Identity a -> a
runIdentity