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 :: K a b -> K a b -> K a b
parK (K KSP a b
l) (K KSP a b
r) = KSP a b -> K a b
forall hi ho. KSP hi ho -> K hi ho
K{-kk-} (KSP a b -> KSP a b -> KSP a b
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 :: KSP a b -> KSP a b -> KSP a b
parKSP KSP a b
l KSP a b
r = [Message FResponse a
 -> Either (Message FResponse a) (Message FResponse a)]
-> SP
     (Either (Message FResponse a) (Message FResponse a))
     (Either (Message FRequest b) (Message FRequest b))
-> KSP a b
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 KSP a b
-> KSP a b
-> SP
     (Either (Message FResponse a) (Message FResponse a))
     (Either (Message FRequest b) (Message FRequest b))
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 (SP
  (Either (Message FResponse b) (Message FResponse b))
  (Either (Message FRequest b) (Message FRequest b))
-> ([Either (Message FRequest b) (Message FRequest b)],
    SP
      (Either (Message FResponse b) (Message FResponse b))
      (Either (Message FRequest b) (Message FRequest b)))
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
         [] ->
	   Cont
  (SP (Message FResponse b) (Message FRequest b))
  (Message FResponse b)
forall a b. Cont (SP a b) a
getSP Cont
  (SP (Message FResponse b) (Message FRequest b))
  (Message FResponse b)
-> Cont
     (SP (Message FResponse b) (Message FRequest b))
     (Message FResponse b)
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?
		r: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 [Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
forall a b. a -> Either a b
Left Message FResponse b
msg, Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
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 ([Either (Message FResponse b) (Message FResponse b)]
-> SP
     (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))
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 (b -> Message FRequest b
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 (b -> Message FRequest b
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 Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
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 Message FResponse b
-> Either (Message FResponse b) (Message FResponse b)
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 =
	       Message FRequest b
-> SP (Message FResponse b) (Message FRequest b)
-> SP (Message FResponse b) (Message FRequest b)
forall b a. b -> SP a b -> SP a b
putSP (FRequest -> Message FRequest b
forall a b. a -> Message a b
Low FRequest
c) (SP (Message FResponse b) (Message FRequest b)
 -> SP (Message FResponse b) (Message FRequest b))
-> SP (Message FResponse b) (Message FRequest b)
-> SP (Message FResponse b) (Message FRequest b)
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)]
routeq[Message FResponse b
 -> Either (Message FResponse b) (Message FResponse b)]
-> [Message FResponse b
    -> Either (Message FResponse b) (Message FResponse b)]
-> [Message FResponse b
    -> Either (Message FResponse b) (Message FResponse b)]
forall 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 = Message FRequest b
-> SP (Message FResponse b) (Message FRequest b)
-> SP (Message FResponse b) (Message FRequest b)
forall b a. b -> SP a b -> SP a b
putSP Message FRequest b
m (SP (Message FResponse b) (Message FRequest b)
 -> SP (Message FResponse b) (Message FRequest b))
-> SP (Message FResponse b) (Message FRequest b)
-> SP (Message FResponse b) (Message FRequest b)
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 :: K a b -> K c d -> K (Either a c) (Either b d)
compK (K KSP a b
l) (K KSP c d
r) = KSP (Either a c) (Either b d) -> K (Either a c) (Either b d)
forall hi ho. KSP hi ho -> K hi ho
K{-kk-} (KSP a b -> KSP c d -> KSP (Either a c) (Either b d)
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 :: KSP a b -> KSP c d -> KSP (Either a c) (Either b d)
compKSP KSP a b
l KSP c d
r = KSP (Either a c) (Either b d)
-> KSP (Either a c) (Either b d) -> KSP (Either a c) (Either b d)
forall a b. KSP a b -> KSP a b -> KSP a b
parKSP (b -> Either b d
forall a b. a -> Either a b
Left (b -> Either b d)
-> KSP a b -> Fa FResponse FRequest a (Either b d)
forall a b c d e. (a -> b) -> Fa c d e a -> Fa c d e b
`postMapHigh'` KSP a b
l Fa FResponse FRequest a (Either b d)
-> SP (Either a c) a -> KSP (Either a c) (Either b d)
forall a b c d e. Fa a b c d -> SP e c -> Fa a b e d
`preProcessHigh'` SP (Either a c) a
forall b1 b2. SP (Either b1 b2) b1
filterLeftSP)
		     (d -> Either b d
forall a b. b -> Either a b
Right (d -> Either b d)
-> KSP c d -> Fa FResponse FRequest c (Either b d)
forall a b c d e. (a -> b) -> Fa c d e a -> Fa c d e b
`postMapHigh'` KSP c d
r Fa FResponse FRequest c (Either b d)
-> SP (Either a c) c -> KSP (Either a c) (Either b d)
forall a b c d e. Fa a b c d -> SP e c -> Fa a b e d
`preProcessHigh'` SP (Either a c) c
forall a1 b. SP (Either a1 b) b
filterRightSP)