module ParK(parK,compK) where
--import Command(Command(..))
import CompSP
--import Event(Event(..))
import Fudget
--import Message(Message(..))
--import Path(Path(..))
--import SP
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{-kk-} (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 [] -- response without request?
		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{-kk-} (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)