diff options
author | Eduardo Julian | 2020-12-10 00:15:15 -0400 |
---|---|---|
committer | Eduardo Julian | 2020-12-10 00:15:15 -0400 |
commit | 14287585025b2d8fff1991691def9e643b039ac8 (patch) | |
tree | 4fdbe2aafa907d1dd0f47150c545adf3eabeb124 /stdlib/source/lux/data/number/ratio.lux | |
parent | 893c76ad530ca0e81cd84602543c3114407f4592 (diff) |
Re-named "with-cover" to "for".
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/lux/data/number/ratio.lux | 93 |
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] |