module ParK(parK,compK) where
import CompSP
import Fudget
import Spops
import IsRequest
import CompFfun
import SpEither
parK :: K a b -> K a b -> K a b
parK :: forall a b. K a b -> K a b -> K a b
parK (K KSP a b
l) (K KSP a b
r) = forall hi ho. KSP hi ho -> K hi ho
K (forall a b. KSP a b -> KSP a b -> KSP a b
parKSP KSP a b
l KSP a b
r)
parKSP :: KSP a b -> KSP a b -> KSP a b
parKSP :: forall a b. KSP a b -> KSP a b -> KSP a b
parKSP KSP a b
l KSP a b
r = forall {b} {b}.
[Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
-> SP (Message FResponse b) (Message FRequest b)
pkp [] (KSP a b
l forall {a1} {a2} {a3} {b}.
SP a1 a2 -> SP a3 b -> SP (Either a1 a3) (Either a2 b)
`compEitherSP` KSP a b
r) where
pkp :: [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
-> SP (Message FResponse b) (Message FRequest b)
pkp [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
k = [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> ([Either (Message FRequest b) (Message FRequest b)],
SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b)))
-> SP (Message FResponse b) (Message FRequest b)
pk [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq (forall {a1} {a2}. SP a1 a2 -> ([a2], SP a1 a2)
pullSP SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
k)
pk :: [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> ([Either (Message FRequest b) (Message FRequest b)],
SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b)))
-> SP (Message FResponse b) (Message FRequest b)
pk [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq ([Either (Message FRequest b) (Message FRequest b)]
os,SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
k) = [Either (Message FRequest b) (Message FRequest b)]
-> SP (Message FResponse b) (Message FRequest b)
pos [Either (Message FRequest b) (Message FRequest b)]
os where
pos :: [Either (Message FRequest b) (Message FRequest b)]
-> SP (Message FResponse b) (Message FRequest b)
pos [Either (Message FRequest b) (Message FRequest b)]
os =
case [Either (Message FRequest b) (Message FRequest b)]
os of
[] ->
forall a b. Cont (SP a b) a
getSP forall a b. (a -> b) -> a -> b
$ \Message FResponse b
msg ->
case Message FResponse b
msg of
Low FResponse
e | FResponse -> Bool
isResponse FResponse
e ->
case [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq of
[] -> [Either (Message FRequest b) (Message FRequest b)]
-> SP (Message FResponse b) (Message FRequest b)
pos []
Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
r:[Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq -> [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> [Either (Message FResponse b) (Message FResponse b)]
-> SP (Message FResponse b) (Message FRequest b)
feed [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
r Message FResponse b
msg]
Message FResponse b
_ -> [Either (Message FResponse b) (Message FResponse b)]
-> SP (Message FResponse b) (Message FRequest b)
feedr [forall a b. a -> Either a b
Left Message FResponse b
msg, forall a b. b -> Either a b
Right Message FResponse b
msg]
where feed :: [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> [Either (Message FResponse b) (Message FResponse b)]
-> SP (Message FResponse b) (Message FRequest b)
feed [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq [Either (Message FResponse b) (Message FResponse b)]
l = [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
-> SP (Message FResponse b) (Message FRequest b)
pkp [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq (forall a b. [a] -> SP a b -> SP a b
startupSP [Either (Message FResponse b) (Message FResponse b)]
l SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
k)
feedr :: [Either (Message FResponse b) (Message FResponse b)]
-> SP (Message FResponse b) (Message FRequest b)
feedr = [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> [Either (Message FResponse b) (Message FResponse b)]
-> SP (Message FResponse b) (Message FRequest b)
feed [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeq
Either (Message FRequest b) (Message FRequest b)
o:[Either (Message FRequest b) (Message FRequest b)]
os -> case Either (Message FRequest b) (Message FRequest b)
o of
Right (High b
a) -> Message FRequest b -> SP (Message FResponse b) (Message FRequest b)
out (forall a b. b -> Message a b
High b
a)
Left (High b
a) -> Message FRequest b -> SP (Message FResponse b) (Message FRequest b)
out (forall a b. b -> Message a b
High b
a)
Right (Low FRequest
c) -> FRequest
-> (Message FResponse b
-> Either (Message FResponse b) (Message FResponse b))
-> SP (Message FResponse b) (Message FRequest b)
lowout FRequest
c forall a b. b -> Either a b
Right
Left (Low FRequest
c) -> FRequest
-> (Message FResponse b
-> Either (Message FResponse b) (Message FResponse b))
-> SP (Message FResponse b) (Message FRequest b)
lowout FRequest
c forall a b. a -> Either a b
Left
where
lowout :: FRequest
-> (Message FResponse b
-> Either (Message FResponse b) (Message FResponse b))
-> SP (Message FResponse b) (Message FRequest b)
lowout FRequest
c Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
route =
forall b a. b -> SP a b -> SP a b
putSP (forall a b. a -> Message a b
Low FRequest
c) forall a b. (a -> b) -> a -> b
$
if FRequest -> Bool
isRequest FRequest
c
then [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
-> ([Either (Message FRequest b) (Message FRequest b)],
SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b)))
-> SP (Message FResponse b) (Message FRequest b)
pk ([Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)]
routeqforall a. [a] -> [a] -> [a]
++[Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
route]) ([Either (Message FRequest b) (Message FRequest b)]
os,SP
(Either (Message FResponse b) (Message FResponse b))
(Either (Message FRequest b) (Message FRequest b))
k)
else [Either (Message FRequest b) (Message FRequest b)]
-> SP (Message FResponse b) (Message FRequest b)
pos [Either (Message FRequest b) (Message FRequest b)]
os
out :: Message FRequest b -> SP (Message FResponse b) (Message FRequest b)
out Message FRequest b
m = forall b a. b -> SP a b -> SP a b
putSP Message FRequest b
m forall a b. (a -> b) -> a -> b
$ [Either (Message FRequest b) (Message FRequest b)]
-> SP (Message FResponse b) (Message FRequest b)
pos [Either (Message FRequest b) (Message FRequest b)]
os
compK :: K a b -> K c d -> K (Either a c) (Either b d)
compK :: forall a b c d. K a b -> K c d -> K (Either a c) (Either b d)
compK (K KSP a b
l) (K KSP c d
r) = forall hi ho. KSP hi ho -> K hi ho
K (forall a b c d. KSP a b -> KSP c d -> KSP (Either a c) (Either b d)
compKSP KSP a b
l KSP c d
r)
compKSP :: KSP a b -> KSP c d -> KSP (Either a c) (Either b d)
compKSP :: forall a b c d. KSP a b -> KSP c d -> KSP (Either a c) (Either b d)
compKSP KSP a b
l KSP c d
r = forall a b. KSP a b -> KSP a b -> KSP a b
parKSP (forall a b. a -> Either a b
Left forall a b c d e. (a -> b) -> Fa c d e a -> Fa c d e b
`postMapHigh'` KSP a b
l forall a b c d e. Fa a b c d -> SP e c -> Fa a b e d
`preProcessHigh'` forall {b1} {b2}. SP (Either b1 b2) b1
filterLeftSP)
(forall a b. b -> Either a b
Right forall a b c d e. (a -> b) -> Fa c d e a -> Fa c d e b
`postMapHigh'` KSP c d
r forall a b c d e. Fa a b c d -> SP e c -> Fa a b e d
`preProcessHigh'` forall {a1} {b}. SP (Either a1 b) b
filterRightSP)