aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/order.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/abstract/order.lux')
-rw-r--r--stdlib/source/library/lux/abstract/order.lux58
1 files changed, 58 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/abstract/order.lux b/stdlib/source/library/lux/abstract/order.lux
new file mode 100644
index 000000000..3eaafaf3a
--- /dev/null
+++ b/stdlib/source/library/lux/abstract/order.lux
@@ -0,0 +1,58 @@
+(.module:
+ [library
+ [lux #*
+ [control
+ ["." function]]]]
+ [//
+ ["." equivalence (#+ Equivalence)]
+ [functor
+ ["." contravariant]]])
+
+(interface: #export (Order a)
+ {#.doc "A signature for types that possess some sense of ordering among their elements."}
+
+ (: (Equivalence a)
+ &equivalence)
+
+ (: (-> a a Bit)
+ <)
+ )
+
+(type: #export (Comparison a)
+ (-> (Order a) a a Bit))
+
+(def: #export (<= order parameter subject)
+ Comparison
+ (or (\ order < parameter subject)
+ (\ order = parameter subject)))
+
+(def: #export (> order parameter subject)
+ Comparison
+ (\ order < subject parameter))
+
+(def: #export (>= order parameter subject)
+ Comparison
+ (or (\ order < subject parameter)
+ (\ order = subject parameter)))
+
+(type: #export (Choice a)
+ (-> (Order a) a a a))
+
+(def: #export (min order x y)
+ Choice
+ (if (\ order < y x) x y))
+
+(def: #export (max order x y)
+ Choice
+ (if (\ order < y x) y x))
+
+(implementation: #export functor
+ (contravariant.Functor Order)
+
+ (def: (map f order)
+ (implementation
+ (def: &equivalence
+ (\ equivalence.functor map f (\ order &equivalence)))
+
+ (def: (< reference sample)
+ (\ order < (f reference) (f sample))))))