RxHaskell icon indicating copy to clipboard operation
RxHaskell copied to clipboard

Behaviour of `switch`

Open as-capabl opened this issue 9 years ago • 2 comments

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

as-capabl avatar Oct 27 '14 16:10 as-capabl