add lib.math
parent
c8f786cd40
commit
5b0b20b3a9
@ -0,0 +1,46 @@
|
|||||||
|
# inefficient, but sufficient math functions missing in Nix & nixpkgs
|
||||||
|
{ lib, ... }@flakeArg:
|
||||||
|
let
|
||||||
|
inherit (builtins) foldl' genList isInt;
|
||||||
|
inherit (lib.lists) imap0 reverseList;
|
||||||
|
inherit (lib.strings) stringToCharacters;
|
||||||
|
inherit (lib.trivial) flip pipe;
|
||||||
|
in
|
||||||
|
rec {
|
||||||
|
|
||||||
|
bitAsString = bool: if bool then "1" else "0";
|
||||||
|
|
||||||
|
binToInt = flip pipe [
|
||||||
|
stringToCharacters
|
||||||
|
reverseList
|
||||||
|
(imap0 (i: x: if x == "1" then pow 2 i else 0))
|
||||||
|
(foldl' (a: v: a + v) 0)
|
||||||
|
];
|
||||||
|
|
||||||
|
intToBin =
|
||||||
|
len: num:
|
||||||
|
assert isInt len && isInt num;
|
||||||
|
let
|
||||||
|
maxVal = pow 2 len;
|
||||||
|
twoPowers = genList (i: pow 2 (len - 1 - i)) len;
|
||||||
|
init = {
|
||||||
|
number = num;
|
||||||
|
output = "";
|
||||||
|
};
|
||||||
|
folder =
|
||||||
|
{ number, output }:
|
||||||
|
power:
|
||||||
|
let
|
||||||
|
bit = number >= power;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
number = if bit then number - power else number;
|
||||||
|
output = "${output}${bitAsString bit}";
|
||||||
|
};
|
||||||
|
in
|
||||||
|
assert num < maxVal;
|
||||||
|
(foldl' folder init twoPowers).output;
|
||||||
|
|
||||||
|
pow = x: exp: foldl' (a: b: a * b) 1 (genList (_: x) exp); # TODO
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue