aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/data/number/ratio.lux
diff options
context:
space:
mode:
authorEduardo Julian2020-12-10 00:15:15 -0400
committerEduardo Julian2020-12-10 00:15:15 -0400
commit14287585025b2d8fff1991691def9e643b039ac8 (patch)
tree4fdbe2aafa907d1dd0f47150c545adf3eabeb124 /stdlib/source/lux/data/number/ratio.lux
parent893c76ad530ca0e81cd84602543c3114407f4592 (diff)
Re-named "with-cover" to "for".
Diffstat (limited to '')
-rw-r--r--stdlib/source/lux/data/number/ratio.lux93
1 files changed, 61 insertions, 32 deletions
diff --git a/stdlib/source/lux/data/number/ratio.lux b/stdlib/source/lux/data/number/ratio.lux
index 8f22aca70..0d67bd3d6 100644
--- a/stdlib/source/lux/data/number/ratio.lux
+++ b/stdlib/source/lux/data/number/ratio.lux
@@ -1,6 +1,6 @@
(.module:
{#.doc "Rational numbers."}
- [lux #*
+ [lux (#- nat)
[abstract
[equivalence (#+ Equivalence)]
[order (#+ Order)]
@@ -10,8 +10,8 @@
[control
["." function]
["." try]
- ["p" parser
- ["s" code (#+ Parser)]]]
+ ["<>" parser
+ ["<.>" code (#+ Parser)]]]
[data
["." product]
["." maybe]
@@ -27,6 +27,39 @@
{#numerator Nat
#denominator Nat})
+(def: #export (nat value)
+ (-> Ratio (Maybe Nat))
+ (case (get@ #denominator value)
+ 1 (#.Some (get@ #numerator value))
+ _ #.None))
+
+(def: (normalize (^slots [#numerator #denominator]))
+ (-> Ratio Ratio)
+ (let [common (n.gcd numerator denominator)]
+ {#numerator (n./ common numerator)
+ #denominator (n./ common denominator)}))
+
+(syntax: #export (ratio numerator {?denominator (<>.maybe <code>.any)})
+ {#.doc (doc "Rational literals."
+ (ratio numerator denominator)
+ "The denominator can be omitted if it's 1."
+ (ratio numerator))}
+ (wrap (list (` ((~! ..normalize) {#..numerator (~ numerator)
+ #..denominator (~ (maybe.default (' 1)
+ ?denominator))})))))
+
+(def: #export (= parameter subject)
+ (-> Ratio Ratio Bit)
+ (and (n.= (get@ #numerator parameter)
+ (get@ #numerator subject))
+ (n.= (get@ #denominator parameter)
+ (get@ #denominator subject))))
+
+(structure: #export equivalence
+ (Equivalence Ratio)
+
+ (def: = ..=))
+
(def: (equalize parameter subject)
(-> Ratio Ratio [Nat Nat])
[(n.* (get@ #denominator subject)
@@ -34,26 +67,30 @@
(n.* (get@ #denominator parameter)
(get@ #numerator subject))])
-(def: (normalize (^slots [#numerator #denominator]))
- (-> Ratio Ratio)
- (let [common (n.gcd numerator denominator)]
- {#numerator (n./ common numerator)
- #denominator (n./ common denominator)}))
+(def: #export (< parameter subject)
+ (-> Ratio Ratio Bit)
+ (let [[parameter' subject'] (..equalize parameter subject)]
+ (n.< parameter' subject')))
-(structure: #export equivalence (Equivalence Ratio)
- (def: (= parameter subject)
- (and (n.= (get@ #numerator parameter)
- (get@ #numerator subject))
- (n.= (get@ #denominator parameter)
- (get@ #denominator subject)))))
+(def: #export (<= parameter subject)
+ (-> Ratio Ratio Bit)
+ (or (< parameter subject)
+ (= parameter subject)))
-(structure: #export order (Order Ratio)
- (def: &equivalence ..equivalence)
+(def: #export (> parameter subject)
+ (-> Ratio Ratio Bit)
+ (..< subject parameter))
- (def: (< parameter subject)
- (let [[parameter' subject'] (..equalize parameter subject)]
- (n.< parameter' subject')))
- )
+(def: #export (>= parameter subject)
+ (-> Ratio Ratio Bit)
+ (or (> parameter subject)
+ (= parameter subject)))
+
+(structure: #export order
+ (Order Ratio)
+
+ (def: &equivalence ..equivalence)
+ (def: < ..<))
(def: #export (+ parameter subject)
(-> Ratio Ratio Ratio)
@@ -95,7 +132,9 @@
(def: separator ":")
-(structure: #export codec (Codec Text Ratio)
+(structure: #export codec
+ (Codec Text Ratio)
+
(def: (encode (^slots [#numerator #denominator]))
($_ text\compose (n\encode numerator) ..separator (n\encode denominator)))
@@ -111,22 +150,12 @@
#.None
(#.Left (text\compose "Invalid syntax for ratio: " input)))))
-(syntax: #export (ratio numerator {?denominator (p.maybe s.any)})
- {#.doc (doc "Rational literals."
- (ratio numerator denominator)
- "The denominator can be omitted if it's 1."
- (ratio numerator))}
- (wrap (list (` ((~! ..normalize) {#..numerator (~ numerator)
- #..denominator (~ (maybe.default (' 1)
- ?denominator))})))))
-
(template [<identity> <compose> <name>]
[(structure: #export <name>
(Monoid Ratio)
(def: identity (..ratio <identity>))
- (def: compose <compose>)
- )]
+ (def: compose <compose>))]
[0 ..+ addition]
[1 ..* multiplication]