diff options
Diffstat (limited to 'stdlib/source/lux/data/number.lux')
-rw-r--r-- | stdlib/source/lux/data/number.lux | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/stdlib/source/lux/data/number.lux b/stdlib/source/lux/data/number.lux index 82f8cadbb..b48aa5f7d 100644 --- a/stdlib/source/lux/data/number.lux +++ b/stdlib/source/lux/data/number.lux @@ -9,6 +9,7 @@ interval codec) (data ["R" result] + [maybe] [bit]))) ## [Structures] @@ -180,7 +181,7 @@ (def: (encode value) (loop [input value output ""] - (let [digit (assume (get-char <char-set> (n.% <base> input))) + (let [digit (maybe;assume (get-char <char-set> (n.% <base> input))) output' (_lux_proc ["text" "append"] [digit output]) input' (n./ <base> input)] (if (n.= +0 input') @@ -196,7 +197,7 @@ (loop [idx +1 output +0] (if (n.< input-size idx) - (let [digit (assume (get-char input idx))] + (let [digit (maybe;assume (get-char input idx))] (case (_lux_proc ["text" "index"] [<char-set> digit +0]) #;None (#R;Error (_lux_proc ["text" "append"] [<error> repr])) @@ -227,10 +228,10 @@ (loop [input (|> value (i./ <base>) (:: Number<Int> abs)) output (|> value (i.% <base>) (:: Number<Int> abs) int-to-nat (get-char <char-set>) - assume)] + maybe;assume)] (if (i.= 0 input) (_lux_proc ["text" "append"] [sign output]) - (let [digit (assume (get-char <char-set> (int-to-nat (i.% <base> input))))] + (let [digit (maybe;assume (get-char <char-set> (int-to-nat (i.% <base> input))))] (recur (i./ <base> input) (_lux_proc ["text" "append"] [digit output])))))))) @@ -247,7 +248,7 @@ (loop [idx (if (i.= -1 sign) +1 +0) output 0] (if (n.< input-size idx) - (let [digit (assume (get-char input idx))] + (let [digit (maybe;assume (get-char input idx))] (case (_lux_proc ["text" "index"] [<char-set> digit +0]) #;None (#R;Error <error>) @@ -266,7 +267,7 @@ (def: (de-prefix input) (-> Text Text) - (assume (_lux_proc ["text" "clip"] [input +1 (_lux_proc ["text" "size"] [input])]))) + (maybe;assume (_lux_proc ["text" "clip"] [input +1 (_lux_proc ["text" "size"] [input])]))) (do-template [<struct> <nat> <char-bit-size> <error>] [(struct: #export <struct> (Codec Text Deg) @@ -315,7 +316,7 @@ (_lux_proc ["text" "append"] ["." output]) (let [shifted (f.* <base> dec-left) digit (|> shifted (f.% <base>) frac-to-int int-to-nat - (get-char <char-set>) assume)] + (get-char <char-set>) maybe;assume)] (recur (f.% 1.0 shifted) (_lux_proc ["text" "append"] [output digit]))))))] (_lux_proc ["text" "append"] [whole-part decimal-part]))) @@ -323,8 +324,8 @@ (def: (decode repr) (case (_lux_proc ["text" "index"] [repr "." +0]) (#;Some split-index) - (let [whole-part (assume (_lux_proc ["text" "clip"] [repr +0 split-index])) - decimal-part (assume (_lux_proc ["text" "clip"] [repr (n.inc split-index) (_lux_proc ["text" "size"] [repr])]))] + (let [whole-part (maybe;assume (_lux_proc ["text" "clip"] [repr +0 split-index])) + decimal-part (maybe;assume (_lux_proc ["text" "clip"] [repr (n.inc split-index) (_lux_proc ["text" "size"] [repr])]))] (case [(:: <int> decode whole-part) (:: <int> decode decimal-part)] (^multi [(#;Some whole) (#;Some decimal)] @@ -368,8 +369,8 @@ (if (n.<= chunk-size num-digits) (list digits) (let [boundary (n.- chunk-size num-digits) - chunk (assume (_lux_proc ["text" "clip"] [digits boundary num-digits])) - remaining (assume (_lux_proc ["text" "clip"] [digits +0 boundary]))] + chunk (maybe;assume (_lux_proc ["text" "clip"] [digits boundary num-digits])) + remaining (maybe;assume (_lux_proc ["text" "clip"] [digits +0 boundary]))] (list& chunk (segment-digits chunk-size remaining))))))) (def: (bin-segment-to-hex input) @@ -497,11 +498,11 @@ (def: (encode value) (let [sign (:: Number<Frac> signum value) raw-bin (:: Binary@Codec<Text,Frac> encode value) - dot-idx (assume (_lux_proc ["text" "index"] [raw-bin "." +0])) - whole-part (assume (_lux_proc ["text" "clip"] [raw-bin - (if (f.= -1.0 sign) +1 +0) - dot-idx])) - decimal-part (assume (_lux_proc ["text" "clip"] [raw-bin (n.inc dot-idx) (_lux_proc ["text" "size"] [raw-bin])])) + dot-idx (maybe;assume (_lux_proc ["text" "index"] [raw-bin "." +0])) + whole-part (maybe;assume (_lux_proc ["text" "clip"] [raw-bin + (if (f.= -1.0 sign) +1 +0) + dot-idx])) + decimal-part (maybe;assume (_lux_proc ["text" "clip"] [raw-bin (n.inc dot-idx) (_lux_proc ["text" "size"] [raw-bin])])) hex-output (|> (<from> false decimal-part) ["."] (_lux_proc ["text" "append"]) @@ -520,8 +521,8 @@ 1.0)] (case (_lux_proc ["text" "index"] [repr "." +0]) (#;Some split-index) - (let [whole-part (assume (_lux_proc ["text" "clip"] [repr (if (f.= -1.0 sign) +1 +0) split-index])) - decimal-part (assume (_lux_proc ["text" "clip"] [repr (n.inc split-index) (_lux_proc ["text" "size"] [repr])])) + (let [whole-part (maybe;assume (_lux_proc ["text" "clip"] [repr (if (f.= -1.0 sign) +1 +0) split-index])) + decimal-part (maybe;assume (_lux_proc ["text" "clip"] [repr (n.inc split-index) (_lux_proc ["text" "size"] [repr])])) as-binary (|> (<to> decimal-part) ["."] (_lux_proc ["text" "append"]) @@ -602,7 +603,7 @@ (def: (digits-get idx digits) (-> Nat Digits Nat) - (default +0 (_lux_proc ["array" "get"] [digits idx]))) + (maybe;default +0 (_lux_proc ["array" "get"] [digits idx]))) (def: (digits-put idx digit digits) (-> Nat Nat Digits Digits) @@ -677,7 +678,7 @@ (loop [idx +0 output (make-digits [])] (if (n.< length idx) - (let [char (assume (get-char input idx))] + (let [char (maybe;assume (get-char input idx))] (case (_lux_proc ["text" "index"] ["0123456789" char +0]) #;None #;None @@ -749,7 +750,7 @@ (if (and dotted? (n.<= (n.inc bit;width) length)) (case (|> (_lux_proc ["text" "clip"] [input +1 length]) - assume + maybe;assume text-to-digits) (#;Some digits) (loop [digits digits |