aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/equivalence.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/abstract/equivalence.lux')
-rw-r--r--stdlib/source/library/lux/abstract/equivalence.lux25
1 files changed, 25 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/abstract/equivalence.lux b/stdlib/source/library/lux/abstract/equivalence.lux
new file mode 100644
index 000000000..bb21f7711
--- /dev/null
+++ b/stdlib/source/library/lux/abstract/equivalence.lux
@@ -0,0 +1,25 @@
+(.module:
+ [library
+ [lux #*]]
+ [//
+ [functor
+ ["." contravariant]]])
+
+(interface: #export (Equivalence a)
+ {#.doc "Equivalence for a type's instances."}
+ (: (-> a a Bit)
+ =))
+
+(def: #export (rec sub)
+ (All [a] (-> (-> (Equivalence a) (Equivalence a)) (Equivalence a)))
+ (implementation
+ (def: (= left right)
+ (sub = left right))))
+
+(implementation: #export functor
+ (contravariant.Functor Equivalence)
+
+ (def: (map f equivalence)
+ (implementation
+ (def: (= reference sample)
+ (\ equivalence = (f reference) (f sample))))))