reset a3, kut Charlie ;)
[tt2015.git] / a3 / code / Generics / GenEq.icl
diff --git a/a3/code/Generics/GenEq.icl b/a3/code/Generics/GenEq.icl
new file mode 100644 (file)
index 0000000..6bb1c8b
--- /dev/null
@@ -0,0 +1,35 @@
+implementation module GenEq\r
+\r
+import StdGeneric, StdEnv\r
+\r
+generic gEq a  :: a a -> Bool\r
+gEq{|Int|}     x y                                                     = x == y\r
+gEq{|Char|} x y                                                        = x == y\r
+gEq{|Bool|} x y                                                        = x == y\r
+gEq{|Real|} x y                                                        = x == y\r
+gEq{|String|} x y                                                      = x == y\r
+gEq{|UNIT|} UNIT UNIT                                          = True\r
+gEq{|PAIR|} fx fy (PAIR x1 y1) (PAIR x2 y2) = fx x1 x2 && fy y1 y2\r
+gEq{|EITHER|} fl fr (LEFT x) (LEFT y)          = fl x y\r
+gEq{|EITHER|} fl fr (RIGHT x) (RIGHT y)        = fr x y\r
+gEq{|EITHER|} fl fr    _ _                             = False\r
+gEq{|CONS|} f (CONS x) (CONS y)                        = f x y\r
+gEq{|FIELD|} f (FIELD x) (FIELD y)                     = f x y\r
+gEq{|OBJECT|} f (OBJECT x) (OBJECT y)          = f x y\r
+gEq{|{}|} f xs ys                                                      = eqArray f xs ys\r
+gEq{|{!}|} f xs ys                                                     = eqArray f xs ys\r
+\r
+derive gEq [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\r
+\r
+\r
+(===) infix 4 :: a a -> Bool | gEq{|*|} a\r
+(===) x y = gEq{|*|} x y\r
+\r
+(=!=) infix 4 :: a a -> Bool | gEq{|*|} a\r
+(=!=) x y = not (x === y)\r
+\r
+eqArray f xs ys = size xs == size ys && eq 0 (size xs) xs ys\r
+where\r
+       eq i n xs ys\r
+               | i == n        = True          \r
+               | i < n         = f xs.[i] ys.[i] && eq (inc i) n xs ys\r