packages feed

rhine-0.9: src/FRP/Rhine/Schedule/Util.hs

-- | Utility to define certain deterministic schedules.
module FRP.Rhine.Schedule.Util where

-- dunai
import Data.MonadicStreamFunction
import Data.MonadicStreamFunction.Async

{- | In a composite running clock,
   duplicate the tick of one subclock.
-}
duplicateSubtick :: Monad m => MSF m () (time, Either a b) -> MSF m () (time, Either a (Either a b))
duplicateSubtick runningClock = concatS $ runningClock >>> arr duplicateLeft
  where
    duplicateLeft (time, Left a) = [(time, Left a), (time, Right $ Left a)]
    duplicateLeft (time, Right b) = [(time, Right $ Right b)]

-- TODO Why is stuff like this not in base? Maybe send pull request...
swapEither :: Either a b -> Either b a
swapEither (Left a) = Right a
swapEither (Right b) = Left b