reset a3, kut Charlie ;)
[tt2015.git] / a3 / code / Generics / GenReduce.icl
1 implementation module GenReduce
2
3 import StdGeneric, _Array
4
5 // or crush
6 generic gReduce t :: (a a -> a) a t -> a
7 gReduce{|c|} op e x = e
8 gReduce{|PAIR|} fx fy op e (PAIR x y) = op (fx op e x) (fy op e y)
9 gReduce{|EITHER|} fl fr op e (LEFT x) = fl op e x
10 gReduce{|EITHER|} fl fr op e (RIGHT x) = fr op e x
11 gReduce{|CONS|} f op e (CONS x) = f op e x
12 gReduce{|FIELD|} f op e (FIELD x) = f op e x
13 gReduce{|OBJECT|} f op e (OBJECT x) = f op e x
14 gReduce{|{}|} f op e x = reduceArray f op e x
15 gReduce{|{!}|} f op e x = reduceArray f op e x
16 derive gReduce [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
17
18 generic gReduceRSt t :: .t .st -> .st
19 gReduceRSt{|c|} x st = st
20 gReduceRSt{|PAIR|} fx fy (PAIR x y) st = fx x (fy y st)
21 gReduceRSt{|EITHER|} fl fr x st = reduceEITHER fl fr x st
22 gReduceRSt{|CONS|} f (CONS x) st = f x st
23 gReduceRSt{|FIELD|} f (FIELD x) st = f x st
24 gReduceRSt{|OBJECT|} f (OBJECT x) st = f x st
25 gReduceRSt{|{}|} f xs st = reduceArrayRSt f xs st
26 gReduceRSt{|{!}|} f xs st = reduceArrayRSt f xs st
27 derive gReduceRSt [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
28
29 generic gReduceLSt t :: .t .st -> .st
30 gReduceLSt{|c|} x st = st
31 gReduceLSt{|PAIR|} fx fy (PAIR x y) st = fy y (fx x st)
32 gReduceLSt{|EITHER|} fl fr x st = reduceEITHER fl fr x st
33 gReduceLSt{|CONS|} f (CONS x) st = f x st
34 gReduceLSt{|FIELD|} f (FIELD x) st = f x st
35 gReduceLSt{|OBJECT|} f (OBJECT x) st = f x st
36 gReduceLSt{|{}|} f xs st = reduceArrayLSt f xs st
37 gReduceLSt{|{!}|} f xs st = reduceArrayLSt f xs st
38 derive gReduceLSt [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
39
40 reduceEITHER fl fr (LEFT x) st = fl x st
41 reduceEITHER fl fr (RIGHT x) st = fr x st
42
43