right clean Generics library version added
[tt2015.git] / a3 / code / Generics / GenEq.icl
1 implementation module GenEq
2
3 import StdGeneric, StdEnv
4
5 generic gEq a :: a a -> Bool
6 gEq{|Int|} x y = x == y
7 gEq{|Char|} x y = x == y
8 gEq{|Bool|} x y = x == y
9 gEq{|Real|} x y = x == y
10 gEq{|String|} x y = x == y
11 gEq{|UNIT|} UNIT UNIT = True
12 gEq{|PAIR|} fx fy (PAIR x1 y1) (PAIR x2 y2) = fx x1 x2 && fy y1 y2
13 gEq{|EITHER|} fl fr (LEFT x) (LEFT y) = fl x y
14 gEq{|EITHER|} fl fr (RIGHT x) (RIGHT y) = fr x y
15 gEq{|EITHER|} fl fr _ _ = False
16 gEq{|CONS|} f (CONS x) (CONS y) = f x y
17 gEq{|FIELD|} f (FIELD x) (FIELD y) = f x y
18 gEq{|OBJECT|} f (OBJECT x) (OBJECT y) = f x y
19 gEq{|{}|} f xs ys = eqArray f xs ys
20 gEq{|{!}|} f xs ys = eqArray f xs ys
21
22 derive gEq [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)
23
24
25 (===) infix 4 :: a a -> Bool | gEq{|*|} a
26 (===) x y = gEq{|*|} x y
27
28 (=!=) infix 4 :: a a -> Bool | gEq{|*|} a
29 (=!=) x y = not (x === y)
30
31 eqArray f xs ys = size xs == size ys && eq 0 (size xs) xs ys
32 where
33 eq i n xs ys
34 | i == n = True
35 | i < n = f xs.[i] ys.[i] && eq (inc i) n xs ys