RxHaskell
RxHaskell copied to clipboard
Behaviour of `switch`
I expect result "A-B-A-B" for the code below, but got "A-AB-ABA-ABAB."
It seems that switch
doesn't turn off old signals.
Is this correct behaviour?
code:
{-# Language LambdaCase #-}
module
Main
where
import Prelude hiding (filter)
import Data.Functor
import Control.Monad.Trans
import Control.Monad
import Data.Maybe
import System.Exit
import Disposable
import Signal
import Signal.Operators
import Signal.Command
import Scheduler
import Scheduler.Main
import Signal.Subscriber
import Signal.Channel
import Signal.Connection
data MyCommand = ToggleA | ToggleB | Fire deriving Eq
rx src =
do
let
fires = filter src (==Fire)
out = switch $ filterJust (modes fires <$> src)
ssc <- liftIO $ subscriber $
\case
NextEvent x -> liftIO $ putStr x
_ -> return ()
subscribe out ssc
where
filterJust sig = fmap fromJust (filter sig isJust)
modes fires ToggleA = Just $ fmap (const "A") fires
modes fires ToggleB = Just $ fmap (const "B") fires
modes _ _ = Nothing
rxMain =
do
cmd <- newCommand ExecuteSerially never
_ <- rx (values cmd)
execute cmd ToggleA
execute cmd Fire
liftIO $ putStr "-"
execute cmd ToggleB
execute cmd Fire
liftIO $ putStr "-"
execute cmd ToggleA
execute cmd Fire
liftIO $ putStr "-"
execute cmd ToggleB
execute cmd Fire
liftIO $ exitSuccess
main =
do
sch <- getMainScheduler
schedule sch rxMain
runMainScheduler