module FRP.BearRiver.Scan
( sscan
, sscanPrim
)
where
import Data.MonadicStreamFunction.InternalCore (MSF (..))
import FRP.BearRiver.InternalCore (SF (..))
sscan :: Monad m => (b -> a -> b) -> b -> SF m a b
sscan :: forall (m :: * -> *) b a. Monad m => (b -> a -> b) -> b -> SF m a b
sscan b -> a -> b
f b
bInit = (b -> a -> Maybe (b, b)) -> b -> b -> SF m a b
forall (m :: * -> *) c a b.
Monad m =>
(c -> a -> Maybe (c, b)) -> c -> b -> SF m a b
sscanPrim b -> a -> Maybe (b, b)
f' b
bInit b
bInit
where
f' :: b -> a -> Maybe (b, b)
f' b
b a
a = (b, b) -> Maybe (b, b)
forall a. a -> Maybe a
Just (b
b', b
b')
where
b' :: b
b' = b -> a -> b
f b
b a
a
sscanPrim :: Monad m => (c -> a -> Maybe (c, b)) -> c -> b -> SF m a b
sscanPrim :: forall (m :: * -> *) c a b.
Monad m =>
(c -> a -> Maybe (c, b)) -> c -> b -> SF m a b
sscanPrim c -> a -> Maybe (c, b)
f c
cInit b
bInit = (a -> ClockInfo m (b, MSF (ReaderT DTime m) a b))
-> MSF (ReaderT DTime m) a b
forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF ((a -> ClockInfo m (b, MSF (ReaderT DTime m) a b))
-> MSF (ReaderT DTime m) a b)
-> (a -> ClockInfo m (b, MSF (ReaderT DTime m) a b))
-> MSF (ReaderT DTime m) a b
forall a b. (a -> b) -> a -> b
$ \a
a -> do
let o :: Maybe (c, b)
o = c -> a -> Maybe (c, b)
f c
cInit a
a
case Maybe (c, b)
o of
Maybe (c, b)
Nothing -> (b, MSF (ReaderT DTime m) a b)
-> ClockInfo m (b, MSF (ReaderT DTime m) a b)
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
bInit, (c -> a -> Maybe (c, b)) -> c -> b -> MSF (ReaderT DTime m) a b
forall (m :: * -> *) c a b.
Monad m =>
(c -> a -> Maybe (c, b)) -> c -> b -> SF m a b
sscanPrim c -> a -> Maybe (c, b)
f c
cInit b
bInit)
Just (c
c', b
b') -> (b, MSF (ReaderT DTime m) a b)
-> ClockInfo m (b, MSF (ReaderT DTime m) a b)
forall a. a -> ReaderT DTime m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b', (c -> a -> Maybe (c, b)) -> c -> b -> MSF (ReaderT DTime m) a b
forall (m :: * -> *) c a b.
Monad m =>
(c -> a -> Maybe (c, b)) -> c -> b -> SF m a b
sscanPrim c -> a -> Maybe (c, b)
f c
c' b
b')