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 = 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 = 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 = forall (m :: * -> *) a b. (a -> m (b, MSF m a b)) -> MSF m a b
MSF 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 -> forall (m :: * -> *) a. Monad m => a -> m a
return (b
bInit, 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') -> forall (m :: * -> *) a. Monad m => a -> m a
return (b
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')