{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Reactive.Banana.Combinators (
Event, Behavior,
interpret,
module Control.Applicative,
module Data.Semigroup,
never, unionWith, filterE,
apply,
Moment, MonadMoment(..),
accumE, stepper,
valueB, valueBLater, observeE, switchE, switchB,
(<@>), (<@),
filterJust, filterApply, whenE, split,
unions, accumB, mapAccum,
merge, mergeWith
) where
import Control.Applicative
import Control.Monad
import Data.Maybe (isJust, catMaybes)
import Data.Semigroup
import Data.These (These(..), these)
import qualified Reactive.Banana.Internal.Combinators as Prim
import Reactive.Banana.Types
interpret :: (Event a -> Moment (Event b)) -> [Maybe a] -> IO [Maybe b]
interpret :: (Event a -> Moment (Event b)) -> [Maybe a] -> IO [Maybe b]
interpret Event a -> Moment (Event b)
f [Maybe a]
xs = (Event a -> Moment (Event b)) -> [Maybe a] -> IO [Maybe b]
forall a b.
(Event a -> Moment (Event b)) -> [Maybe a] -> IO [Maybe b]
Prim.interpret ((Event b -> Event b)
-> ReaderT EventNetwork Build (Event b) -> Moment (Event b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Event b -> Event b
forall a. Event a -> Event a
unE (ReaderT EventNetwork Build (Event b) -> Moment (Event b))
-> (Event a -> ReaderT EventNetwork Build (Event b))
-> Event a
-> Moment (Event b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment (Event b) -> ReaderT EventNetwork Build (Event b)
forall a. Moment a -> Moment a
unM (Moment (Event b) -> ReaderT EventNetwork Build (Event b))
-> (Event a -> Moment (Event b))
-> Event a
-> ReaderT EventNetwork Build (Event b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event a -> Moment (Event b)
f (Event a -> Moment (Event b))
-> (Event a -> Event a) -> Event a -> Moment (Event b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event a -> Event a
forall a. Event a -> Event a
E) [Maybe a]
xs
never :: Event a
never :: Event a
never = Event a -> Event a
forall a. Event a -> Event a
E Event a
forall a. Event a
Prim.never
unionWith :: (a -> a -> a) -> Event a -> Event a -> Event a
unionWith :: (a -> a -> a) -> Event a -> Event a -> Event a
unionWith a -> a -> a
f = (a -> a)
-> (a -> a) -> (a -> a -> a) -> Event a -> Event a -> Event a
forall a c b.
(a -> c)
-> (b -> c) -> (a -> b -> c) -> Event a -> Event b -> Event c
mergeWith a -> a
forall a. a -> a
id a -> a
forall a. a -> a
id a -> a -> a
f
merge :: Event a -> Event b -> Event (These a b)
merge :: Event a -> Event b -> Event (These a b)
merge = (a -> These a b)
-> (b -> These a b)
-> (a -> b -> These a b)
-> Event a
-> Event b
-> Event (These a b)
forall a c b.
(a -> c)
-> (b -> c) -> (a -> b -> c) -> Event a -> Event b -> Event c
mergeWith a -> These a b
forall a b. a -> These a b
This b -> These a b
forall a b. b -> These a b
That a -> b -> These a b
forall a b. a -> b -> These a b
These
mergeWith
:: (a -> c)
-> (b -> c)
-> (a -> b -> c)
-> Event a
-> Event b
-> Event c
mergeWith :: (a -> c)
-> (b -> c) -> (a -> b -> c) -> Event a -> Event b -> Event c
mergeWith a -> c
f b -> c
g a -> b -> c
h Event a
e1 Event b
e2 = Event c -> Event c
forall a. Event a -> Event a
E (Event c -> Event c) -> Event c -> Event c
forall a b. (a -> b) -> a -> b
$ (a -> c)
-> (b -> c) -> (a -> b -> c) -> Event a -> Event b -> Event c
forall a c b.
(a -> c)
-> (b -> c) -> (a -> b -> c) -> Event a -> Event b -> Event c
Prim.mergeWith a -> c
f b -> c
g a -> b -> c
h (Event a -> Event a
forall a. Event a -> Event a
unE Event a
e1) (Event b -> Event b
forall a. Event a -> Event a
unE Event b
e2)
filterJust :: Event (Maybe a) -> Event a
filterJust :: Event (Maybe a) -> Event a
filterJust = Event a -> Event a
forall a. Event a -> Event a
E (Event a -> Event a)
-> (Event (Maybe a) -> Event a) -> Event (Maybe a) -> Event a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Maybe a) -> Event a
forall a. Event (Maybe a) -> Event a
Prim.filterJust (Event (Maybe a) -> Event a)
-> (Event (Maybe a) -> Event (Maybe a))
-> Event (Maybe a)
-> Event a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Maybe a) -> Event (Maybe a)
forall a. Event a -> Event a
unE
filterE :: (a -> Bool) -> Event a -> Event a
filterE :: (a -> Bool) -> Event a -> Event a
filterE a -> Bool
p = Event (Maybe a) -> Event a
forall a. Event (Maybe a) -> Event a
filterJust (Event (Maybe a) -> Event a)
-> (Event a -> Event (Maybe a)) -> Event a -> Event a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Maybe a) -> Event a -> Event (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
x -> if a -> Bool
p a
x then a -> Maybe a
forall a. a -> Maybe a
Just a
x else Maybe a
forall a. Maybe a
Nothing)
apply :: Behavior (a -> b) -> Event a -> Event b
apply :: Behavior (a -> b) -> Event a -> Event b
apply Behavior (a -> b)
bf Event a
ex = Event b -> Event b
forall a. Event a -> Event a
E (Event b -> Event b) -> Event b -> Event b
forall a b. (a -> b) -> a -> b
$ Behavior (a -> b) -> Event a -> Event b
forall a b. Behavior (a -> b) -> Event a -> Event b
Prim.applyE (Behavior (a -> b) -> Behavior (a -> b)
forall a. Behavior a -> Behavior a
unB Behavior (a -> b)
bf) (Event a -> Event a
forall a. Event a -> Event a
unE Event a
ex)
stepper :: MonadMoment m => a -> Event a -> m (Behavior a)
stepper :: a -> Event a -> m (Behavior a)
stepper a
a = Moment (Behavior a) -> m (Behavior a)
forall (m :: * -> *) a. MonadMoment m => Moment a -> m a
liftMoment (Moment (Behavior a) -> m (Behavior a))
-> (Event a -> Moment (Behavior a)) -> Event a -> m (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment (Behavior a) -> Moment (Behavior a)
forall a. Moment a -> Moment a
M (Moment (Behavior a) -> Moment (Behavior a))
-> (Event a -> Moment (Behavior a))
-> Event a
-> Moment (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Behavior a -> Behavior a)
-> ReaderT EventNetwork Build (Behavior a) -> Moment (Behavior a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Behavior a -> Behavior a
forall a. Behavior a -> Behavior a
B (ReaderT EventNetwork Build (Behavior a) -> Moment (Behavior a))
-> (Event a -> ReaderT EventNetwork Build (Behavior a))
-> Event a
-> Moment (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Event a -> ReaderT EventNetwork Build (Behavior a)
forall a. a -> Event a -> Moment (Behavior a)
Prim.stepperB a
a (Event a -> ReaderT EventNetwork Build (Behavior a))
-> (Event a -> Event a)
-> Event a
-> ReaderT EventNetwork Build (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event a -> Event a
forall a. Event a -> Event a
unE
accumE :: MonadMoment m => a -> Event (a -> a) -> m (Event a)
accumE :: a -> Event (a -> a) -> m (Event a)
accumE a
acc = Moment (Event a) -> m (Event a)
forall (m :: * -> *) a. MonadMoment m => Moment a -> m a
liftMoment (Moment (Event a) -> m (Event a))
-> (Event (a -> a) -> Moment (Event a))
-> Event (a -> a)
-> m (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment (Event a) -> Moment (Event a)
forall a. Moment a -> Moment a
M (Moment (Event a) -> Moment (Event a))
-> (Event (a -> a) -> Moment (Event a))
-> Event (a -> a)
-> Moment (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Event a -> Event a)
-> ReaderT EventNetwork Build (Event a) -> Moment (Event a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Event a -> Event a
forall a. Event a -> Event a
E (ReaderT EventNetwork Build (Event a) -> Moment (Event a))
-> (Event (a -> a) -> ReaderT EventNetwork Build (Event a))
-> Event (a -> a)
-> Moment (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Event (a -> a) -> ReaderT EventNetwork Build (Event a)
forall a. a -> Event (a -> a) -> Moment (Event a)
Prim.accumE a
acc (Event (a -> a) -> ReaderT EventNetwork Build (Event a))
-> (Event (a -> a) -> Event (a -> a))
-> Event (a -> a)
-> ReaderT EventNetwork Build (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (a -> a) -> Event (a -> a)
forall a. Event a -> Event a
unE
valueB :: MonadMoment m => Behavior a -> m a
valueB :: Behavior a -> m a
valueB = Moment a -> m a
forall (m :: * -> *) a. MonadMoment m => Moment a -> m a
liftMoment (Moment a -> m a) -> (Behavior a -> Moment a) -> Behavior a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment a -> Moment a
forall a. Moment a -> Moment a
M (Moment a -> Moment a)
-> (Behavior a -> Moment a) -> Behavior a -> Moment a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior a -> Moment a
forall a. Behavior a -> Moment a
Prim.valueB (Behavior a -> Moment a)
-> (Behavior a -> Behavior a) -> Behavior a -> Moment a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior a -> Behavior a
forall a. Behavior a -> Behavior a
unB
valueBLater :: MonadMoment m => Behavior a -> m a
valueBLater :: Behavior a -> m a
valueBLater = Moment a -> m a
forall (m :: * -> *) a. MonadMoment m => Moment a -> m a
liftMoment (Moment a -> m a) -> (Behavior a -> Moment a) -> Behavior a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment a -> Moment a
forall a. Moment a -> Moment a
M (Moment a -> Moment a)
-> (Behavior a -> Moment a) -> Behavior a -> Moment a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior a -> Moment a
forall a. Behavior a -> Moment a
Prim.initialBLater (Behavior a -> Moment a)
-> (Behavior a -> Behavior a) -> Behavior a -> Moment a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior a -> Behavior a
forall a. Behavior a -> Behavior a
unB
observeE :: Event (Moment a) -> Event a
observeE :: Event (Moment a) -> Event a
observeE = Event a -> Event a
forall a. Event a -> Event a
E (Event a -> Event a)
-> (Event (Moment a) -> Event a) -> Event (Moment a) -> Event a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Moment a) -> Event a
forall a. Event (Moment a) -> Event a
Prim.observeE (Event (Moment a) -> Event a)
-> (Event (Moment a) -> Event (Moment a))
-> Event (Moment a)
-> Event a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Moment a -> Moment a) -> Event (Moment a) -> Event (Moment a)
forall a b. (a -> b) -> Event a -> Event b
Prim.mapE Moment a -> Moment a
forall a. Moment a -> Moment a
unM (Event (Moment a) -> Event (Moment a))
-> (Event (Moment a) -> Event (Moment a))
-> Event (Moment a)
-> Event (Moment a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Moment a) -> Event (Moment a)
forall a. Event a -> Event a
unE
switchE :: MonadMoment m => Event (Event a) -> m (Event a)
switchE :: Event (Event a) -> m (Event a)
switchE = Moment (Event a) -> m (Event a)
forall (m :: * -> *) a. MonadMoment m => Moment a -> m a
liftMoment (Moment (Event a) -> m (Event a))
-> (Event (Event a) -> Moment (Event a))
-> Event (Event a)
-> m (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment (Event a) -> Moment (Event a)
forall a. Moment a -> Moment a
M (Moment (Event a) -> Moment (Event a))
-> (Event (Event a) -> Moment (Event a))
-> Event (Event a)
-> Moment (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Event a -> Event a)
-> ReaderT EventNetwork Build (Event a) -> Moment (Event a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Event a -> Event a
forall a. Event a -> Event a
E (ReaderT EventNetwork Build (Event a) -> Moment (Event a))
-> (Event (Event a) -> ReaderT EventNetwork Build (Event a))
-> Event (Event a)
-> Moment (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Event a) -> ReaderT EventNetwork Build (Event a)
forall a. Event (Event a) -> Moment (Event a)
Prim.switchE (Event (Event a) -> ReaderT EventNetwork Build (Event a))
-> (Event (Event a) -> Event (Event a))
-> Event (Event a)
-> ReaderT EventNetwork Build (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Event a -> Event a) -> Event (Event a) -> Event (Event a)
forall a b. (a -> b) -> Event a -> Event b
Prim.mapE (Event a -> Event a
forall a. Event a -> Event a
unE) (Event (Event a) -> Event (Event a))
-> (Event (Event a) -> Event (Event a))
-> Event (Event a)
-> Event (Event a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Event a) -> Event (Event a)
forall a. Event a -> Event a
unE
switchB :: MonadMoment m => Behavior a -> Event (Behavior a) -> m (Behavior a)
switchB :: Behavior a -> Event (Behavior a) -> m (Behavior a)
switchB Behavior a
b = Moment (Behavior a) -> m (Behavior a)
forall (m :: * -> *) a. MonadMoment m => Moment a -> m a
liftMoment (Moment (Behavior a) -> m (Behavior a))
-> (Event (Behavior a) -> Moment (Behavior a))
-> Event (Behavior a)
-> m (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Moment (Behavior a) -> Moment (Behavior a)
forall a. Moment a -> Moment a
M (Moment (Behavior a) -> Moment (Behavior a))
-> (Event (Behavior a) -> Moment (Behavior a))
-> Event (Behavior a)
-> Moment (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Behavior a -> Behavior a)
-> ReaderT EventNetwork Build (Behavior a) -> Moment (Behavior a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Behavior a -> Behavior a
forall a. Behavior a -> Behavior a
B (ReaderT EventNetwork Build (Behavior a) -> Moment (Behavior a))
-> (Event (Behavior a) -> ReaderT EventNetwork Build (Behavior a))
-> Event (Behavior a)
-> Moment (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior a
-> Event (Behavior a) -> ReaderT EventNetwork Build (Behavior a)
forall a. Behavior a -> Event (Behavior a) -> Moment (Behavior a)
Prim.switchB (Behavior a -> Behavior a
forall a. Behavior a -> Behavior a
unB Behavior a
b) (Event (Behavior a) -> ReaderT EventNetwork Build (Behavior a))
-> (Event (Behavior a) -> Event (Behavior a))
-> Event (Behavior a)
-> ReaderT EventNetwork Build (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Behavior a -> Behavior a)
-> Event (Behavior a) -> Event (Behavior a)
forall a b. (a -> b) -> Event a -> Event b
Prim.mapE (Behavior a -> Behavior a
forall a. Behavior a -> Behavior a
unB) (Event (Behavior a) -> Event (Behavior a))
-> (Event (Behavior a) -> Event (Behavior a))
-> Event (Behavior a)
-> Event (Behavior a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Event (Behavior a) -> Event (Behavior a)
forall a. Event a -> Event a
unE
infixl 4 <@>, <@
(<@>) :: Behavior (a -> b) -> Event a -> Event b
<@> :: Behavior (a -> b) -> Event a -> Event b
(<@>) = Behavior (a -> b) -> Event a -> Event b
forall a b. Behavior (a -> b) -> Event a -> Event b
apply
(<@) :: Behavior b -> Event a -> Event b
Behavior b
f <@ :: Behavior b -> Event a -> Event b
<@ Event a
g = (b -> a -> b
forall a b. a -> b -> a
const (b -> a -> b) -> Behavior b -> Behavior (a -> b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Behavior b
f) Behavior (a -> b) -> Event a -> Event b
forall a b. Behavior (a -> b) -> Event a -> Event b
<@> Event a
g
filterApply :: Behavior (a -> Bool) -> Event a -> Event a
filterApply :: Behavior (a -> Bool) -> Event a -> Event a
filterApply Behavior (a -> Bool)
bp = ((Bool, a) -> a) -> Event (Bool, a) -> Event a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Bool, a) -> a
forall a b. (a, b) -> b
snd (Event (Bool, a) -> Event a)
-> (Event a -> Event (Bool, a)) -> Event a -> Event a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Bool, a) -> Bool) -> Event (Bool, a) -> Event (Bool, a)
forall a. (a -> Bool) -> Event a -> Event a
filterE (Bool, a) -> Bool
forall a b. (a, b) -> a
fst (Event (Bool, a) -> Event (Bool, a))
-> (Event a -> Event (Bool, a)) -> Event a -> Event (Bool, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior (a -> (Bool, a)) -> Event a -> Event (Bool, a)
forall a b. Behavior (a -> b) -> Event a -> Event b
apply ((\a -> Bool
p a
a-> (a -> Bool
p a
a,a
a)) ((a -> Bool) -> a -> (Bool, a))
-> Behavior (a -> Bool) -> Behavior (a -> (Bool, a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Behavior (a -> Bool)
bp)
whenE :: Behavior Bool -> Event a -> Event a
whenE :: Behavior Bool -> Event a -> Event a
whenE Behavior Bool
bf = Behavior (a -> Bool) -> Event a -> Event a
forall a. Behavior (a -> Bool) -> Event a -> Event a
filterApply (Bool -> a -> Bool
forall a b. a -> b -> a
const (Bool -> a -> Bool) -> Behavior Bool -> Behavior (a -> Bool)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Behavior Bool
bf)
split :: Event (Either a b) -> (Event a, Event b)
split :: Event (Either a b) -> (Event a, Event b)
split Event (Either a b)
e = (Event (Maybe a) -> Event a
forall a. Event (Maybe a) -> Event a
filterJust (Event (Maybe a) -> Event a) -> Event (Maybe a) -> Event a
forall a b. (a -> b) -> a -> b
$ Either a b -> Maybe a
forall a b. Either a b -> Maybe a
fromLeft (Either a b -> Maybe a) -> Event (Either a b) -> Event (Maybe a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event (Either a b)
e, Event (Maybe b) -> Event b
forall a. Event (Maybe a) -> Event a
filterJust (Event (Maybe b) -> Event b) -> Event (Maybe b) -> Event b
forall a b. (a -> b) -> a -> b
$ Either a b -> Maybe b
forall a b. Either a b -> Maybe b
fromRight (Either a b -> Maybe b) -> Event (Either a b) -> Event (Maybe b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event (Either a b)
e)
where
fromLeft :: Either a b -> Maybe a
fromLeft :: Either a b -> Maybe a
fromLeft (Left a
a) = a -> Maybe a
forall a. a -> Maybe a
Just a
a
fromLeft (Right b
b) = Maybe a
forall a. Maybe a
Nothing
fromRight :: Either a b -> Maybe b
fromRight :: Either a b -> Maybe b
fromRight (Left a
a) = Maybe b
forall a. Maybe a
Nothing
fromRight (Right b
b) = b -> Maybe b
forall a. a -> Maybe a
Just b
b
unions :: [Event (a -> a)] -> Event (a -> a)
unions :: [Event (a -> a)] -> Event (a -> a)
unions [] = Event (a -> a)
forall a. Event a
never
unions [Event (a -> a)]
xs = (Event (a -> a) -> Event (a -> a) -> Event (a -> a))
-> [Event (a -> a)] -> Event (a -> a)
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 (((a -> a) -> (a -> a) -> a -> a)
-> Event (a -> a) -> Event (a -> a) -> Event (a -> a)
forall a. (a -> a -> a) -> Event a -> Event a -> Event a
unionWith (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.)) [Event (a -> a)]
xs
accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)
accumB :: a -> Event (a -> a) -> m (Behavior a)
accumB a
acc Event (a -> a)
e = a -> Event a -> m (Behavior a)
forall (m :: * -> *) a.
MonadMoment m =>
a -> Event a -> m (Behavior a)
stepper a
acc (Event a -> m (Behavior a)) -> m (Event a) -> m (Behavior a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< a -> Event (a -> a) -> m (Event a)
forall (m :: * -> *) a.
MonadMoment m =>
a -> Event (a -> a) -> m (Event a)
accumE a
acc Event (a -> a)
e
mapAccum :: MonadMoment m => acc -> Event (acc -> (x,acc)) -> m (Event x, Behavior acc)
mapAccum :: acc -> Event (acc -> (x, acc)) -> m (Event x, Behavior acc)
mapAccum acc
acc Event (acc -> (x, acc))
ef = do
Event (x, acc)
e <- (x, acc) -> Event ((x, acc) -> (x, acc)) -> m (Event (x, acc))
forall (m :: * -> *) a.
MonadMoment m =>
a -> Event (a -> a) -> m (Event a)
accumE (x
forall a. HasCallStack => a
undefined,acc
acc) ((acc -> (x, acc)) -> (x, acc) -> (x, acc)
forall t b a. (t -> b) -> (a, t) -> b
lift ((acc -> (x, acc)) -> (x, acc) -> (x, acc))
-> Event (acc -> (x, acc)) -> Event ((x, acc) -> (x, acc))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event (acc -> (x, acc))
ef)
Behavior acc
b <- acc -> Event acc -> m (Behavior acc)
forall (m :: * -> *) a.
MonadMoment m =>
a -> Event a -> m (Behavior a)
stepper acc
acc ((x, acc) -> acc
forall a b. (a, b) -> b
snd ((x, acc) -> acc) -> Event (x, acc) -> Event acc
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event (x, acc)
e)
(Event x, Behavior acc) -> m (Event x, Behavior acc)
forall (m :: * -> *) a. Monad m => a -> m a
return ((x, acc) -> x
forall a b. (a, b) -> a
fst ((x, acc) -> x) -> Event (x, acc) -> Event x
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Event (x, acc)
e, Behavior acc
b)
where
lift :: (t -> b) -> (a, t) -> b
lift t -> b
f (a
_,t
acc) = t
acc t -> b -> b
`seq` t -> b
f t
acc