diff options
Diffstat (limited to 'stdlib/source/lux/abstract/order.lux')
-rw-r--r-- | stdlib/source/lux/abstract/order.lux | 93 |
1 files changed, 43 insertions, 50 deletions
diff --git a/stdlib/source/lux/abstract/order.lux b/stdlib/source/lux/abstract/order.lux index 32df7d1af..6f992695a 100644 --- a/stdlib/source/lux/abstract/order.lux +++ b/stdlib/source/lux/abstract/order.lux @@ -6,55 +6,48 @@ [functor (#+ Contravariant)] ["." equivalence (#+ Equivalence)]]) -(`` (signature: #export (Order a) - {#.doc "A signature for types that possess some sense of ordering among their elements."} - - (: (Equivalence a) - &equivalence) - - (~~ (template [<name>] - [(: (-> a a Bit) <name>)] - - [<] [<=] [>] [>=] - )) - )) - -(def: #export (order equivalence <) - (All [a] - (-> (Equivalence a) (-> a a Bit) (Order a))) - (let [> (function.flip <)] - (structure (def: &equivalence equivalence) - - (def: < <) - - (def: (<= test subject) - (or (< test subject) - (:: equivalence = test subject))) - - (def: > >) - - (def: (>= test subject) - (or (> test subject) - (:: equivalence = test subject)))))) - -(template [<name> <op>] - [(def: #export (<name> order x y) - (All [a] - (-> (Order a) a a a)) - (if (:: order <op> y x) x y))] - - [min <] - [max >] +(signature: #export (Order a) + {#.doc "A signature for types that possess some sense of ordering among their elements."} + + (: (Equivalence a) + &equivalence) + + (: (-> a a Bit) + <) ) -(`` (structure: #export contravariant (Contravariant Order) - (def: (map-1 f order) - (structure - (def: &equivalence (:: equivalence.contravariant map-1 f (:: order &equivalence))) - - (~~ (template [<name>] - [(def: (<name> reference sample) - (:: order <name> (f reference) (f sample)))] - - [<] [<=] [>] [>=] - )))))) +(type: (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: (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)) + +(structure: #export contravariant (Contravariant Order) + (def: (map-1 f order) + (structure + (def: &equivalence (:: equivalence.contravariant map-1 f (:: order &equivalence))) + + (def: (< reference sample) + (:: order < (f reference) (f sample)))))) |