module InputF(module InputF) where
import Fudget
import InputMsg
import CompOps
import ListF(listF)
import Placer(placerF)
import LayoutF(orientP)
import EitherUtils(stripEither)
import Spops
import InputSP
import AuxTypes() -- synonym KeySym, for hbc
import SpEither(splitSP)
import SerCompF(mapF,toBothF)

type InF a b = F a (InputMsg b)

inputPairLF :: Orientation
-> InF a1 b1 -> InF a2 b2 -> F (a1, a2) (InputMsg (b1, b2))
inputPairLF Orientation
orient InF a1 b1
f1 InF a2 b2
f2 = Placer
-> F (a1, a2) (InputMsg (b1, b2)) -> F (a1, a2) (InputMsg (b1, b2))
forall a b. Placer -> F a b -> F a b
placerF (Orientation -> Placer
orientP Orientation
orient) (F (a1, a2) (InputMsg (b1, b2)) -> F (a1, a2) (InputMsg (b1, b2)))
-> F (a1, a2) (InputMsg (b1, b2)) -> F (a1, a2) (InputMsg (b1, b2))
forall a b. (a -> b) -> a -> b
$ InF a1 b1 -> InF a2 b2 -> F (a1, a2) (InputMsg (b1, b2))
forall a1 b1 a2 b2. InF a1 b1 -> InF a2 b2 -> InF (a1, a2) (b1, b2)
inputPairF InF a1 b1
f1 InF a2 b2
f2
inputListLF :: Placer -> [(a, InF b c)] -> F [(a, b)] (InputMsg [(a, c)])
inputListLF Placer
placer [(a, InF b c)]
tfs = Placer
-> F [(a, b)] (InputMsg [(a, c)]) -> F [(a, b)] (InputMsg [(a, c)])
forall a b. Placer -> F a b -> F a b
placerF Placer
placer (F [(a, b)] (InputMsg [(a, c)]) -> F [(a, b)] (InputMsg [(a, c)]))
-> F [(a, b)] (InputMsg [(a, c)]) -> F [(a, b)] (InputMsg [(a, c)])
forall a b. (a -> b) -> a -> b
$ [(a, InF b c)] -> F [(a, b)] (InputMsg [(a, c)])
forall a b c. Eq a => [(a, InF b c)] -> InF [(a, b)] [(a, c)]
inputListF [(a, InF b c)]
tfs

inputPairF :: InF a1 b1 -> InF a2 b2 -> InF (a1,a2) (b1,b2)
inputPairF :: InF a1 b1 -> InF a2 b2 -> InF (a1, a2) (b1, b2)
inputPairF InF a1 b1
f1 InF a2 b2
f2 = SP (Either (InputMsg b1) (InputMsg b2)) (InputMsg (b1, b2))
forall a b. SP (Either (InputMsg a) (InputMsg b)) (InputMsg (a, b))
inputPairSP SP (Either (InputMsg b1) (InputMsg b2)) (InputMsg (b1, b2))
-> F (Either a1 a2) (Either (InputMsg b1) (InputMsg b2))
-> F (Either a1 a2) (InputMsg (b1, b2))
forall a b e. SP a b -> F e a -> F e b
>^^=< (InF a1 b1
f1InF a1 b1
-> InF a2 b2
-> F (Either a1 a2) (Either (InputMsg b1) (InputMsg b2))
forall a b c d. F a b -> F c d -> F (Either a c) (Either b d)
>+<InF a2 b2
f2) F (Either a1 a2) (InputMsg (b1, b2))
-> SP (a1, a2) (Either a1 a2) -> InF (a1, a2) (b1, b2)
forall c d e. F c d -> SP e c -> F e d
>=^^< SP (a1, a2) (Either a1 a2)
forall a b. SP (a, b) (Either a b)
splitSP

inputListF :: (Eq a) => [(a, InF b c)] -> InF [(a, b)] [(a, c)] 
inputListF :: [(a, InF b c)] -> InF [(a, b)] [(a, c)]
inputListF [(a, InF b c)]
tfs =
  [a] -> SP (a, InputMsg c) (InputMsg [(a, c)])
forall a b. Eq a => [a] -> SP (a, InputMsg b) (InputMsg [(a, b)])
inputListSP (((a, InF b c) -> a) -> [(a, InF b c)] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map (a, InF b c) -> a
forall a b. (a, b) -> a
fst [(a, InF b c)]
tfs) SP (a, InputMsg c) (InputMsg [(a, c)])
-> F (a, b) (a, InputMsg c) -> F (a, b) (InputMsg [(a, c)])
forall a b e. SP a b -> F e a -> F e b
>^^=< [(a, InF b c)] -> F (a, b) (a, InputMsg c)
forall a b c. Eq a => [(a, F b c)] -> F (a, b) (a, c)
listF [(a
t,InF b c
f)|(a
t,InF b c
f)<-[(a, InF b c)]
tfs] F (a, b) (InputMsg [(a, c)])
-> SP [(a, b)] (a, b) -> InF [(a, b)] [(a, c)]
forall c d e. F c d -> SP e c -> F e d
>=^^< SP [(a, b)] (a, b)
forall b. SP [b] b
concatSP

inputThroughF :: InF a a -> InF a a
inputThroughF :: InF a a -> InF a a
inputThroughF InF a a
f = Either (InputMsg a) (InputMsg a) -> InputMsg a
forall p. Either p p -> p
stripEither(Either (InputMsg a) (InputMsg a) -> InputMsg a)
-> F (Either a a) (Either (InputMsg a) (InputMsg a))
-> F (Either a a) (InputMsg a)
forall a b e. (a -> b) -> F e a -> F e b
>^=<(InF a a
fInF a a
-> InF a a -> F (Either a a) (Either (InputMsg a) (InputMsg a))
forall a b c d. F a b -> F c d -> F (Either a c) (Either b d)
>+<(a -> InputMsg a) -> InF a a
forall a b. (a -> b) -> F a b
mapF a -> InputMsg a
forall a. a -> InputMsg a
InputChange)F (Either a a) (InputMsg a) -> F a (Either a a) -> InF a a
forall a1 b a2. F a1 b -> F a2 a1 -> F a2 b
>==<F a (Either a a)
forall b. F b (Either b b)
toBothF