aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/hash.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/abstract/hash.lux')
-rw-r--r--stdlib/source/library/lux/abstract/hash.lux27
1 files changed, 27 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/abstract/hash.lux b/stdlib/source/library/lux/abstract/hash.lux
new file mode 100644
index 000000000..2cc18f3e4
--- /dev/null
+++ b/stdlib/source/library/lux/abstract/hash.lux
@@ -0,0 +1,27 @@
+(.module:
+ [library
+ [lux #*]]
+ [//
+ ["." equivalence (#+ Equivalence)]
+ [functor
+ ["." contravariant]]])
+
+(interface: #export (Hash a)
+ {#.doc (doc "A way to produce hash-codes for a type's instances."
+ "A necessity when working with some data-structures, such as dictionaries or sets.")}
+ (: (Equivalence a)
+ &equivalence)
+ (: (-> a Nat)
+ hash))
+
+(implementation: #export functor
+ (contravariant.Functor Hash)
+
+ (def: (map f super)
+ (implementation
+ (def: &equivalence
+ (\ equivalence.functor map f
+ (\ super &equivalence)))
+
+ (def: hash
+ (|>> f (\ super hash))))))