module LoopCompF(loopCompF,loopCompSP,loopThroughBothF,loopThroughBothSP) where import Fudget import CompFfun(prepostMapHigh) import CompF(compF) import CompSP(compSP,prepostMapSP) import Loop(loopLeftSP) import Loops(loopLeftF) -- loopComp = symmetric version of loopThroughRight loopCompF :: F (Either (Either r2l inl) (Either l2r inr)) (Either (Either l2r outl) (Either r2l outr)) -> F (Either inl inr) (Either outl outr) loopCompF = loopLeftF . prepostMapHigh pre post loopThroughBothF fud1 fud2 = loopCompF (fud1 `compF` fud2) loopThroughBothSP sp1 sp2 = loopCompSP (sp1 `compSP` sp2) loopCompSP = loopLeftSP . prepostMapSP pre post post (Left (Left x)) = Left (Left x) post (Left (Right x)) = Right (Left x) post (Right (Left x)) = Left (Right x) post (Right (Right x)) = Right (Right x) -- post = either (either (Left.Left) (Right.Left)) (either (Left.Right) (Right.Right)) pre (Right (Left x)) = Left (Right x) pre (Right (Right x)) = Right (Right x) pre (Left (Left x)) = Right (Left x) pre (Left (Right x)) = Left (Left x)