1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
data Compoz a b where
Id :: (Read a, Show a) => Compoz a a
Cons :: (Read b, Read c, Show c) => (b -> c) -> Compoz a b -> Compoz a c
data Layers = Layers Int Int
serialize = show
deserialize = read
layer3 :: Int -> Bool
layer3 = (== 1)
layer2 :: [Int] -> Int
layer2 = length
layer1 :: Maybe Int -> [Int]
layer1 m = case m of Just x -> [x]; Nothing -> []
chain :: Compoz (Maybe Int) Bool
chain = Cons layer3 $ Cons layer2 $ Cons layer1 $ Id
compose :: Compoz a b -> (a -> b)
compose Id = id
compose (Cons x xs) = x . compose xs
dropC :: Int -> Compoz a b -> (forall c. Show c => Compoz a c -> d) -> d
dropC _ Id f = f Id
dropC 0 (Cons x xs) f = f (Cons x xs)
dropC n (Cons x xs) f = dropC (n1) xs f
takeC :: Int -> Compoz a b -> (forall c. Read c => Compoz c b -> d) -> d
takeC _ Id f = f Id
takeC 0 (Cons x xs) f = f Id
takeC n (Cons x xs) f = takeC (n1) xs (\ys -> f $ Cons x ys)
lengthC :: Compoz a b -> Int
lengthC Id = 0
lengthC (Cons x xs) = 1 + lengthC xs
runLayers :: Layers -> (String -> String)
runLayers (Layers a b) =
dropC (nb) chain $ \xs ->
takeC (ba+1) xs $ \ys ->
serialize . compose ys . deserialize
where
n = lengthC chain
|