1 {-# LANGUAGE Arrows #-}
3 module Reactogon.Auxiliary.Auxiliary where
8 -- stepBack contains its previous argument as its output. Because it's
9 -- hard to define it at time 0, it's wrapped up in a Maybe.
10 stepBack :: SF a (Maybe a)
11 stepBack = sscan f (Nothing, Nothing) >>^ snd
12 where f :: (Maybe a, Maybe a) -> a -> (Maybe a, Maybe a)
13 f (Nothing,Nothing) x' = (Just x', Nothing)
14 f (Just x, _) x' = (Just x', Just x)
16 -- Just like stepBack but the output value is always defined and is
17 -- equal to the input at time 0.
19 stepBack' = proc x -> do
21 returnA -< maybe x id x'
23 -- Throws an Event when the incoming signal change. The Event is
24 -- tagged with the new value.
25 onChange :: (Eq a) => SF a (Event a)
26 onChange = proc x -> do
29 | isNothing x' = NoEvent
30 | isJust x' = let x'' = fromJust x' in
31 if x'' == x then NoEvent else Event x
32 returnA -< makeEvent x x'
34 -- Similar to onChange but contains its initial value in the first
36 onChange' :: (Eq a) => SF a (Event a)
37 onChange' = proc x -> do
39 -- If it's the first value, throw an Event, else behave like onChange.
41 | isNothing x' = Event x
42 | isJust x' = let x'' = fromJust x' in
43 if x'' == x then NoEvent else Event x
44 returnA -< makeEvent x x'