fudgets-0.18.3: hsrc/combinators/LoopLow.hs
module LoopLow(loopLow,loopThroughLowSP,loopThroughLowF) where
--import Command(Command(..))
import CompSP
--import Event(Event(..))
import Fudget
import Loop
--import Message(Message(..))
--import Path(Path(..))
--import SP
import Loopthrough(loopThroughRightSP)
loopLow :: (SP TCommand (FCommand a)) -> (SP (FEvent a) TEvent) -> (F b c) -> F b c
loopLow ch eh (F f) =
let prep (Left msg) = Low (High msg)
prep (Right (High msg)) = High msg
prep (Right (Low msg)) = Low (Low msg)
post (High msg) = Right (High msg)
post (Low (High msg)) = Left msg
post (Low (Low msg)) = Right (Low msg)
in F{-ff-} $
loopLeftSP
(prepostMapSP prep post
(idHighSP ch `serCompSP` f `serCompSP` idHighSP eh))
loopThroughLowSP :: SP (Either c e) (Either c e) ->
SP (Message e a) (Message c b) ->
SP (Message e a) (Message c b)
loopThroughLowSP ctrl f =
loopThroughRightSP (prepostMapSP prep post (idHighSP ctrl)) f
where
prep msg = case msg of
Right (High a) -> High (Left a)
Left (High a) -> High (Right a)
Right (Low e) -> Low (Right e)
Left (Low c) -> Low (Left c)
post msg = case msg of
High (Left msg) -> Left (High msg)
High (Right msg) -> Right (High msg)
Low (Left c) -> Right (Low c)
Low (Right e) -> Left (Low e)
loopThroughLowF
:: SP (Either TCommand TEvent) (Either TCommand TEvent) -> F i o -> F i o
loopThroughLowF ctrlSP (F fudSP) = F $ loopThroughLowSP ctrlSP fudSP