refactor(users/sterni/nix): move generic number operation into num
We omit type checks for performance reasons in most places currently, so the library grouping is important in showing people what to use for what sort of input. The moved functions make sense to use with floats as well, so we'll move them to the num library. Some of the remaining functions could theoretically be adapted and moved, but aren't for now. Change-Id: Ifdecaa60be594f4438b2a58b9ea6445e2da080e3 Reviewed-on: https://cl.tvl.fyi/c/depot/+/9007 Tested-by: BuildkiteCI Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
parent
dbdb2575cf
commit
984ea69386
6 changed files with 64 additions and 45 deletions
|
|
@ -2,31 +2,22 @@
|
|||
|
||||
let
|
||||
|
||||
# TODO(sterni): implement nix.float and figure out which of these
|
||||
# functions can be split out into a common nix.num
|
||||
# library.
|
||||
|
||||
inherit (depot.users.sterni.nix)
|
||||
string
|
||||
num
|
||||
;
|
||||
|
||||
inherit (builtins)
|
||||
bitOr
|
||||
bitAnd
|
||||
bitXor
|
||||
mul
|
||||
div
|
||||
add
|
||||
sub
|
||||
;
|
||||
|
||||
abs = i: if i < 0 then -i else i;
|
||||
|
||||
exp = base: pow:
|
||||
if pow > 0
|
||||
then base * (exp base (pow - 1))
|
||||
else if pow < 0
|
||||
then 1.0 / exp base (abs pow)
|
||||
then 1.0 / exp base (num.abs pow)
|
||||
else 1;
|
||||
|
||||
bitShiftR = bit: count:
|
||||
|
|
@ -52,7 +43,7 @@ let
|
|||
in
|
||||
if int == 0
|
||||
then "0"
|
||||
else "${sign}${go (abs int)}";
|
||||
else "${sign}${go (num.abs int)}";
|
||||
|
||||
fromHexMap = builtins.listToAttrs
|
||||
(lib.imap0 (i: c: { name = c; value = i; })
|
||||
|
|
@ -94,26 +85,17 @@ let
|
|||
odd = x: bitAnd x 1 == 1;
|
||||
even = x: bitAnd x 1 == 0;
|
||||
|
||||
# div and mod behave like quot and rem in Haskell,
|
||||
# i. e. they truncate towards 0
|
||||
inherit (builtins) div;
|
||||
mod = a: b: let res = a / b; in a - (res * b);
|
||||
|
||||
inRange = a: b: x: x >= a && x <= b;
|
||||
|
||||
sum = builtins.foldl' (a: b: a + b) 0;
|
||||
|
||||
in
|
||||
{
|
||||
inherit
|
||||
maxBound
|
||||
minBound
|
||||
abs
|
||||
exp
|
||||
odd
|
||||
even
|
||||
add
|
||||
sub
|
||||
mul
|
||||
div
|
||||
mod
|
||||
bitShiftR
|
||||
|
|
@ -123,7 +105,5 @@ in
|
|||
bitXor
|
||||
toHex
|
||||
fromHex
|
||||
inRange
|
||||
sum
|
||||
;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,9 +15,6 @@ let
|
|||
;
|
||||
|
||||
testBounds = it "checks minBound and maxBound" [
|
||||
# this is gonna blow up in my face because
|
||||
# integer overflow is undefined behavior in
|
||||
# C++, so most likely anything could happen?
|
||||
(assertEq "maxBound is the maxBound" true
|
||||
(int.maxBound + 1 < int.maxBound))
|
||||
(assertEq "minBound is the minBound" true
|
||||
|
|
@ -321,7 +318,6 @@ let
|
|||
testBasic = it "checks basic int operations" [
|
||||
(assertEq "122 is even" (int.even 122 && !(int.odd 122)) true)
|
||||
(assertEq "123 is odd" (int.odd 123 && !(int.even 123)) true)
|
||||
(assertEq "abs -4959" (int.abs (-4959)) 4959)
|
||||
];
|
||||
|
||||
expNumbers = [
|
||||
|
|
@ -374,7 +370,7 @@ let
|
|||
checkShiftLMulExp = n:
|
||||
assertEq "${toString n} >> 6 == ${toString n} * 2 ^ 6"
|
||||
(int.bitShiftL n 5)
|
||||
(int.mul n (int.exp 2 5));
|
||||
(n * (int.exp 2 5));
|
||||
|
||||
testBit = it "checks bitwise operations" (lib.flatten [
|
||||
(builtins.map checkShift shifts)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue