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 :: SP TCommand (FCommand a) -> SP (FEvent a) TEvent -> F b c -> F b c
loopLow SP TCommand (FCommand a)
ch SP (FEvent a) TEvent
eh (F FSP b c
f) =
    let prep :: Either b (Message a b) -> Message (Message a b) b
prep (Left b
msg) = Message a b -> Message (Message a b) b
forall a b. a -> Message a b
Low (b -> Message a b
forall a b. b -> Message a b
High b
msg)
        prep (Right (High b
msg)) = b -> Message (Message a b) b
forall a b. b -> Message a b
High b
msg
        prep (Right (Low a
msg)) = Message a b -> Message (Message a b) b
forall a b. a -> Message a b
Low (a -> Message a b
forall a b. a -> Message a b
Low a
msg)
        post :: Message (Message a a) b -> Either a (Message a b)
post (High b
msg) = Message a b -> Either a (Message a b)
forall a b. b -> Either a b
Right (b -> Message a b
forall a b. b -> Message a b
High b
msg)
        post (Low (High a
msg)) = a -> Either a (Message a b)
forall a b. a -> Either a b
Left a
msg
        post (Low (Low a
msg)) = Message a b -> Either a (Message a b)
forall a b. b -> Either a b
Right (a -> Message a b
forall a b. a -> Message a b
Low a
msg)
    in FSP b c -> F b c
forall hi ho. FSP hi ho -> F hi ho
F{-ff-} (FSP b c -> F b c) -> FSP b c -> F b c
forall a b. (a -> b) -> a -> b
$
	SP (Either a (Message TEvent b)) (Either a (Message TCommand c))
-> FSP b c
forall a1 a2 b. SP (Either a1 a2) (Either a1 b) -> SP a2 b
loopLeftSP
	  ((Either a (Message TEvent b) -> Message (FEvent a) b)
-> (Message (FCommand a) c -> Either a (Message TCommand c))
-> SP (Message (FEvent a) b) (Message (FCommand a) c)
-> SP (Either a (Message TEvent b)) (Either a (Message TCommand c))
forall t1 a t2 b. (t1 -> a) -> (t2 -> b) -> SP a t2 -> SP t1 b
prepostMapSP Either a (Message TEvent b) -> Message (FEvent a) b
forall b a b. Either b (Message a b) -> Message (Message a b) b
prep Message (FCommand a) c -> Either a (Message TCommand c)
forall a a b. Message (Message a a) b -> Either a (Message a b)
post	
		        (SP TCommand (FCommand a)
-> SP (Message TCommand c) (Message (FCommand a) c)
forall a1 a2 b. SP a1 a2 -> SP (Message a1 b) (Message a2 b)
idHighSP SP TCommand (FCommand a)
ch SP (Message TCommand c) (Message (FCommand a) c)
-> FSP b c -> SP (Message TEvent b) (Message (FCommand a) c)
forall a1 b a2. SP a1 b -> SP a2 a1 -> SP a2 b
`serCompSP` FSP b c
f SP (Message TEvent b) (Message (FCommand a) c)
-> SP (Message (FEvent a) b) (Message TEvent b)
-> SP (Message (FEvent a) b) (Message (FCommand a) c)
forall a1 b a2. SP a1 b -> SP a2 a1 -> SP a2 b
`serCompSP` SP (FEvent a) TEvent
-> SP (Message (FEvent a) b) (Message TEvent b)
forall a1 a2 b. SP a1 a2 -> SP (Message a1 b) (Message a2 b)
idHighSP SP (FEvent a) TEvent
eh))

loopThroughLowSP :: SP (Either c e) (Either c e) -> 
		    SP (Message e a) (Message c b) ->
 	            SP (Message e a) (Message c b)

loopThroughLowSP :: SP (Either c e) (Either c e)
-> SP (Message e a) (Message c b) -> SP (Message e a) (Message c b)
loopThroughLowSP SP (Either c e) (Either c e)
ctrl SP (Message e a) (Message c b)
f =
    SP
  (Either (Message c b) (Message e a))
  (Either (Message e a) (Message c b))
-> SP (Message e a) (Message c b) -> SP (Message e a) (Message c b)
forall a1 a2 a3 b.
SP (Either a1 a2) (Either a3 b) -> SP a3 a1 -> SP a2 b
loopThroughRightSP ((Either (Message c b) (Message e a)
 -> Message (Either c e) (Either a b))
-> (Message (Either c e) (Either a b)
    -> Either (Message e a) (Message c b))
-> SP
     (Message (Either c e) (Either a b))
     (Message (Either c e) (Either a b))
-> SP
     (Either (Message c b) (Message e a))
     (Either (Message e a) (Message c b))
forall t1 a t2 b. (t1 -> a) -> (t2 -> b) -> SP a t2 -> SP t1 b
prepostMapSP Either (Message c b) (Message e a)
-> Message (Either c e) (Either a b)
forall a b b a.
Either (Message a b) (Message b a)
-> Message (Either a b) (Either a b)
prep Message (Either c e) (Either a b)
-> Either (Message e a) (Message c b)
forall a a b b.
Message (Either a a) (Either b b)
-> Either (Message a b) (Message a b)
post (SP (Either c e) (Either c e)
-> SP
     (Message (Either c e) (Either a b))
     (Message (Either c e) (Either a b))
forall a1 a2 b. SP a1 a2 -> SP (Message a1 b) (Message a2 b)
idHighSP SP (Either c e) (Either c e)
ctrl)) SP (Message e a) (Message c b)
f
  where
    prep :: Either (Message a b) (Message b a)
-> Message (Either a b) (Either a b)
prep Either (Message a b) (Message b a)
msg = case Either (Message a b) (Message b a)
msg of
		 Right (High a
a) -> Either a b -> Message (Either a b) (Either a b)
forall a b. b -> Message a b
High (a -> Either a b
forall a b. a -> Either a b
Left a
a)
		 Left (High b
a) -> Either a b -> Message (Either a b) (Either a b)
forall a b. b -> Message a b
High (b -> Either a b
forall a b. b -> Either a b
Right b
a)
		 Right (Low b
e) -> Either a b -> Message (Either a b) (Either a b)
forall a b. a -> Message a b
Low (b -> Either a b
forall a b. b -> Either a b
Right b
e)
		 Left (Low a
c) -> Either a b -> Message (Either a b) (Either a b)
forall a b. a -> Message a b
Low (a -> Either a b
forall a b. a -> Either a b
Left a
c)

    post :: Message (Either a a) (Either b b)
-> Either (Message a b) (Message a b)
post Message (Either a a) (Either b b)
msg = case Message (Either a a) (Either b b)
msg of
		 High (Left b
msg) -> Message a b -> Either (Message a b) (Message a b)
forall a b. a -> Either a b
Left (b -> Message a b
forall a b. b -> Message a b
High b
msg)
		 High (Right b
msg) -> Message a b -> Either (Message a b) (Message a b)
forall a b. b -> Either a b
Right (b -> Message a b
forall a b. b -> Message a b
High b
msg)
		 Low (Left a
c) -> Message a b -> Either (Message a b) (Message a b)
forall a b. b -> Either a b
Right (a -> Message a b
forall a b. a -> Message a b
Low a
c)
		 Low (Right a
e) -> Message a b -> Either (Message a b) (Message a b)
forall a b. a -> Either a b
Left (a -> Message a b
forall a b. a -> Message a b
Low a
e)

loopThroughLowF
  :: SP (Either TCommand TEvent) (Either TCommand TEvent) -> F i o -> F i o
loopThroughLowF :: SP (Either TCommand TEvent) (Either TCommand TEvent)
-> F i o -> F i o
loopThroughLowF SP (Either TCommand TEvent) (Either TCommand TEvent)
ctrlSP (F FSP i o
fudSP) = FSP i o -> F i o
forall hi ho. FSP hi ho -> F hi ho
F (FSP i o -> F i o) -> FSP i o -> F i o
forall a b. (a -> b) -> a -> b
$ SP (Either TCommand TEvent) (Either TCommand TEvent)
-> FSP i o -> FSP i o
forall c e a b.
SP (Either c e) (Either c e)
-> SP (Message e a) (Message c b) -> SP (Message e a) (Message c b)
loopThroughLowSP SP (Either TCommand TEvent) (Either TCommand TEvent)
ctrlSP FSP i o
fudSP