module LayoutDoNow where
import Fudget
import FRequest
import Spops
import Path(here)
import LayoutRequest
import IsRequest
layoutDoNow :: F hi ho -> F hi ho
layoutDoNow (F FSP hi ho
sp) = forall hi ho. FSP hi ho -> F hi ho
F (forall {a} {b} {b}.
SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
-> SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
layoutDoNow' FSP hi ho
sp)
layoutDoNow' :: SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
-> SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
layoutDoNow' SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
f = forall {b} {a} {b}.
Int
-> ([Message (Path, FRequest) b],
SP (Message (a, FResponse) b) (Message (Path, FRequest) b))
-> SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
donow Int
0 (forall {a1} {a2}. SP a1 a2 -> ([a2], SP a1 a2)
pullSP SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
f) where
donow :: Int
-> ([Message (Path, FRequest) b],
SP (Message (a, FResponse) b) (Message (Path, FRequest) b))
-> SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
donow Int
pendingreqs ([Message (Path, FRequest) b]
os,SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
f) =
forall b a. [b] -> SP a b -> SP a b
putsSP [Message (Path, FRequest) b]
os forall a b. (a -> b) -> a -> b
$
let n' :: Int
n' = Int
pendingreqs forall a. Num a => a -> a -> a
+ Int
newreqs
newreqs :: Int
newreqs = forall (t :: * -> *) a. Foldable t => t a -> Int
length (forall a. (a -> Bool) -> [a] -> [a]
filter forall {a} {b}. Message (a, FRequest) b -> Bool
isReq [Message (Path, FRequest) b]
os)
isReq :: Message (a, FRequest) b -> Bool
isReq (Low (a
_,FRequest
c)) = FRequest -> Bool
isRequest FRequest
c
isReq Message (a, FRequest) b
_ = Bool
False
nResp :: Message (a, FResponse) b -> a
nResp (Low (a
_,FResponse
e)) | FResponse -> Bool
isResponse FResponse
e = a
1
nResp Message (a, FResponse) b
_ = a
0
in if Int
n' forall a. Eq a => a -> a -> Bool
== Int
0 then forall b a. b -> SP a b -> SP a b
putSP (forall a b. a -> Message a b
Low (Path
here,LayoutMessage -> FRequest
LCmd LayoutMessage
LayoutDoNow)) SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
f
else
forall a b. Cont (SP a b) a
getSP forall a b. (a -> b) -> a -> b
$ \Message (a, FResponse) b
msg -> Int
-> ([Message (Path, FRequest) b],
SP (Message (a, FResponse) b) (Message (Path, FRequest) b))
-> SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
donow (Int
n' forall a. Num a => a -> a -> a
- forall {a} {a} {b}. Num a => Message (a, FResponse) b -> a
nResp Message (a, FResponse) b
msg) (forall {a1} {a2}. SP a1 a2 -> a1 -> ([a2], SP a1 a2)
walkSP SP (Message (a, FResponse) b) (Message (Path, FRequest) b)
f Message (a, FResponse) b
msg)