module DynListF(dynF, DynFMsg(..), dynListF) where
import Command
import FRequest
--import Xtypes
import CompOps((>^=<),(>=^^<))
import CompSP
import Dynforkmerge
import Fudget
--import Message(Message(..))
import NullF
import Spops
import Direction
import Path
import LayoutRequest

type DynFMsg a b = DynMsg a (F a b)

dynListF :: F (Int, DynFMsg a b) (Int, b)
dynListF :: forall a b. F (Int, DynFMsg a b) (Int, b)
dynListF =
    let prep :: Message ([Direction], b) (Int, DynMsg b (F hi ho))
-> [Message
      ([Direction], FRequest)
      (Int, DynMsg (Message ([Direction], b) b) (FSP hi ho))]
prep (High (Int
t, DynMsg b
m)) = [forall a b. b -> Message a b
High (Int
t, forall a b. a -> DynMsg a b
DynMsg (forall a b. b -> Message a b
High b
m))]
        prep (High (Int
t, DynMsg b (F hi ho)
DynDestroy)) = 
	    forall a b. (a -> b) -> [a] -> [b]
map forall {b} {b}. b -> Message ([Direction], b) b
tag [XCommand -> FRequest
XCmd XCommand
DestroyWindow,LayoutMessage -> FRequest
LCmd LayoutMessage
LayoutDestroy] 
		forall a. [a] -> [a] -> [a]
++ [forall a b. b -> Message a b
High (Int
t, forall a b. DynMsg a b
DynDestroy)] 
	    where tag :: b -> Message ([Direction], b) b
tag b
m = forall a b. a -> Message a b
Low (Direction -> [Direction] -> [Direction]
turn (Int -> Direction
Dno Int
t) [Direction]
here, b
m)
        prep (High (Int
t, DynCreate (F FSP hi ho
f))) = [forall a b. b -> Message a b
High (Int
t, forall a b. b -> DynMsg a b
DynCreate FSP hi ho
f)]
        prep (Low ([], b
ev)) = []
        prep (Low ([Direction]
tag, b
ev)) =
            case [Direction] -> (Direction, [Direction])
path [Direction]
tag of
              (Dno Int
i, [Direction]
tag') -> [forall a b. b -> Message a b
High (Int
i, forall a b. a -> DynMsg a b
DynMsg (forall a b. a -> Message a b
Low ([Direction]
tag', b
ev)))]
	      (Direction, [Direction])
_ -> [] -- wrong address!
        post :: Message ([Direction], b) (Int, Message ([Direction], b) b)
-> Message ([Direction], b) (Int, b)
post (High (Int
t, High b
m)) = forall a b. b -> Message a b
High (Int
t, b
m)
        post (High (Int
i, Low ([Direction]
tag, b
cmd))) = forall a b. a -> Message a b
Low (Direction -> [Direction] -> [Direction]
turn (Int -> Direction
Dno Int
i) [Direction]
tag, b
cmd)
        post (Low ([Direction], b)
c) = forall a b. a -> Message a b
Low ([Direction], b)
c
    in forall hi ho. FSP hi ho -> F hi ho
F{-ff-} forall a b. (a -> b) -> a -> b
$ forall {a1} {b} {a2}. SP a1 b -> SP a2 a1 -> SP a2 b
serCompSP (forall {t} {b} {a}. (t -> b) -> SP a t -> SP a b
postMapSP forall {b} {b}.
Message ([Direction], b) (Int, Message ([Direction], b) b)
-> Message ([Direction], b) (Int, b)
post (forall {a1} {b} {a2}. SP a1 b -> SP (Message a2 a1) (Message a2 b)
idLowSP forall a b c. Eq a => SP (a, DynSPMsg b c) (a, c)
dynforkmerge)) (forall {t} {b}. (t -> [b]) -> SP t b
concmapSP forall {b} {b} {hi} {ho}.
Message ([Direction], b) (Int, DynMsg b (F hi ho))
-> [Message
      ([Direction], FRequest)
      (Int, DynMsg (Message ([Direction], b) b) (FSP hi ho))]
prep)

dynF :: (F a b) -> F (Either (F a b) a) b
dynF :: forall a b. F a b -> F (Either (F a b) a) b
dynF F a b
f0 =
    let prep :: Either b a -> [(a, DynMsg a b)]
prep (Left b
f) = [(a
0, forall a b. DynMsg a b
DynDestroy), (a
0, forall a b. b -> DynMsg a b
DynCreate b
f)]
        prep (Right a
m) = [(a
0, forall a b. a -> DynMsg a b
DynMsg a
m)]
    in (forall a b. (a, b) -> b
snd forall a b e. (a -> b) -> F e a -> F e b
>^=< forall {hi} {ho}. [hi] -> F hi ho -> F hi ho
startupF [(Int
0, forall a b. b -> DynMsg a b
DynCreate F a b
f0)] forall a b. F (Int, DynFMsg a b) (Int, b)
dynListF) forall c d e. F c d -> SP e c -> F e d
>=^^< forall {t} {b}. (t -> [b]) -> SP t b
concmapSP forall {a} {b} {a}. Num a => Either b a -> [(a, DynMsg a b)]
prep