aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/data/number/int.lux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/lux/data/number/int.lux47
1 files changed, 26 insertions, 21 deletions
diff --git a/stdlib/source/lux/data/number/int.lux b/stdlib/source/lux/data/number/int.lux
index 38a0dc63a..087302b8d 100644
--- a/stdlib/source/lux/data/number/int.lux
+++ b/stdlib/source/lux/data/number/int.lux
@@ -87,7 +87,9 @@
[(../ param subject)
(..% param subject)])
-(def: #export negate (-> Int Int) (..* -1))
+(def: #export (negate value)
+ (-> Int Int)
+ (..- value +0))
(def: #export (abs x)
(-> Int Int)
@@ -102,13 +104,13 @@
## else
+1))
-(def: #export (mod param subject)
+(def: #export (mod divisor dividend)
(All [m] (-> Int Int Int))
- (let [raw (..% param subject)]
- (if (..< +0 raw)
- (let [shift (if (..< +0 param) ..- ..+)]
- (|> raw (shift param)))
- raw)))
+ (if (..= (..signum divisor) (..signum dividend))
+ (..% divisor dividend)
+ (case (..% divisor dividend)
+ +0 +0
+ rem (..+ divisor rem))))
(def: #export even?
(-> Int Bit)
@@ -185,23 +187,26 @@
[minimum ..min (\ ..interval top)]
)
+(def: -sign "-")
+(def: +sign "+")
+
(def: (sign!! value)
(-> Int Text)
(if (..< +0 value)
- "-"
- "+"))
+ ..-sign
+ ..+sign))
(def: (sign?? representation)
(-> Text (Maybe Int))
- (case ("lux text char" 0 representation)
- (^ (char "-"))
- (#.Some -1)
+ (`` (case ("lux text char" 0 representation)
+ (^ (char (~~ (static ..-sign))))
+ (#.Some -1)
- (^ (char "+"))
- (#.Some +1)
+ (^ (char (~~ (static ..+sign))))
+ (#.Some +1)
- _
- #.None))
+ _
+ #.None)))
(def: (int-decode-loop input-size repr sign <base> <to-value> <error>)
(-> Nat Text Int Int (-> Char (Maybe Nat)) Text (Try Int))
@@ -217,7 +222,7 @@
(|> output (..* <base>) (..+ (.int digit-value)))))
(#try.Success (..* sign output)))))
-(template [<struct> <base> <to-character> <to-value> <error>]
+(template [<base> <struct> <to-character> <to-value> <error>]
[(structure: #export <struct>
(Codec Text Int)
@@ -245,10 +250,10 @@
(#try.Failure <error>))
(#try.Failure <error>)))))]
- [binary +2 //nat.binary-character //nat.binary-value "Invalid binary syntax for Int: "]
- [octal +8 //nat.octal-character //nat.octal-value "Invalid octal syntax for Int: "]
- [decimal +10 //nat.decimal-character //nat.decimal-value "Invalid syntax for Int: "]
- [hex +16 //nat.hexadecimal-character //nat.hexadecimal-value "Invalid hexadecimal syntax for Int: "]
+ [+02 binary //nat.binary-character //nat.binary-value "Invalid binary syntax for Int: "]
+ [+08 octal //nat.octal-character //nat.octal-value "Invalid octal syntax for Int: "]
+ [+10 decimal //nat.decimal-character //nat.decimal-value "Invalid syntax for Int: "]
+ [+16 hex //nat.hexadecimal-character //nat.hexadecimal-value "Invalid hexadecimal syntax for Int: "]
)
(structure: #export hash