module FRP.Yampa.Scan
( sscan
, sscanPrim
)
where
import FRP.Yampa.InternalCore (SF(..), sfSScan)
sscan :: (b -> a -> b) -> b -> SF a b
sscan :: (b -> a -> b) -> b -> SF a b
sscan b -> a -> b
f b
b_init = (b -> a -> Maybe (b, b)) -> b -> b -> SF a b
forall c a b. (c -> a -> Maybe (c, b)) -> c -> b -> SF a b
sscanPrim b -> a -> Maybe (b, b)
f' b
b_init b
b_init
where
f' :: b -> a -> Maybe (b, b)
f' b
b a
a = let b' :: b
b' = b -> a -> b
f b
b a
a in (b, b) -> Maybe (b, b)
forall a. a -> Maybe a
Just (b
b', b
b')
sscanPrim :: (c -> a -> Maybe (c, b)) -> c -> b -> SF a b
sscanPrim :: (c -> a -> Maybe (c, b)) -> c -> b -> SF a b
sscanPrim c -> a -> Maybe (c, b)
f c
c_init b
b_init = SF :: forall a b. (a -> Transition a b) -> SF a b
SF {sfTF :: a -> Transition a b
sfTF = a -> Transition a b
tf0}
where
tf0 :: a -> Transition a b
tf0 a
a0 = case c -> a -> Maybe (c, b)
f c
c_init a
a0 of
Maybe (c, b)
Nothing -> ((c -> a -> Maybe (c, b)) -> c -> b -> SF' a b
forall c a b. (c -> a -> Maybe (c, b)) -> c -> b -> SF' a b
sfSScan c -> a -> Maybe (c, b)
f c
c_init b
b_init, b
b_init)
Just (c
c', b
b') -> ((c -> a -> Maybe (c, b)) -> c -> b -> SF' a b
forall c a b. (c -> a -> Maybe (c, b)) -> c -> b -> SF' a b
sfSScan c -> a -> Maybe (c, b)
f c
c' b
b', b
b')