summaryrefslogtreecommitdiffstats
path: root/math.nix
diff options
context:
space:
mode:
Diffstat (limited to 'math.nix')
-rw-r--r--math.nix95
1 files changed, 95 insertions, 0 deletions
diff --git a/math.nix b/math.nix
new file mode 100644
index 0000000..9860449
--- /dev/null
+++ b/math.nix
@@ -0,0 +1,95 @@
+{lib}: rec {
+ /*
+ source: https://github.com/NixOS/nix/issues/10387#issuecomment-2494597690
+
+ Raises the `base` to the power of `power`.
+
+ Considering the small input size and the lack of a built-in power function [2],
+ this naive power implementation should satisfy reasonable performance
+ requirements.
+
+ Due to the lack of a modulo and bitwise AND operator, it is questionable whether
+ the recursive exponentiation by squaring [1] implementation would even be
+ faster.
+
+ [1]: https://en.wikipedia.org/wiki/Exponentiation_by_squaring
+ [2]: https://github.com/NixOS/nix/issues/10387
+
+ # Type
+
+ pow :: Number -> Number -> Number
+
+ # Arguments
+
+ base
+ : The base number to be raised.
+
+ power
+ : The exponent to raise `base` to.
+
+ # Examples
+
+ pow 2 5
+ => 32
+ */
+ pow = base: power:
+ if power == 0
+ then 1
+ else if power > 0
+ then (base * (pow base (power - 1)))
+ else builtins.throw "Negative powers are not supported";
+
+ /*
+ Converts `number` from a binary number to a decimal one.
+
+ The input is indented to be a number composed only of `1`s and `0` (e.g., 10010.)
+
+ # Type
+
+ binaryToDecimal :: Int -> Int
+
+ # Arguments
+
+ number
+ : The sequence of `1`s and `0`s defining a binary number, in little endian.
+
+ # Examples
+
+ binaryToDecimal 1001
+ => 9
+ */
+ binaryToDecimal = number: let
+ binaryList =
+ builtins.map lib.strings.toInt (lib.lists.reverseList (lib.strings.stringToCharacters (builtins.toString number)));
+ in
+ builtins.foldl' (acc: num: acc + num) 0
+ (lib.lists.imap0 (index: elem: elem * (pow 2 index)) binaryList);
+
+ /*
+ Converts `string` to a (probably) unique numerical id.
+
+ This is achieved by hashing the string and returning the first six hex-digits
+ converted to a base 10 number.
+
+ # Type
+
+ idFromString :: String -> Int
+
+ # Arguments
+
+ string
+ : The string to use as seed for the id generation.
+
+ # Examples
+
+ idFromString "3d-printer"
+ => 10365713
+ */
+ idFromString = string: let
+ inputSeed =
+ builtins.concatStringsSep ""
+ (lib.lists.take 6
+ (lib.strings.stringToCharacters (builtins.hashString "sha256" string)));
+ in
+ lib.trivial.fromHexString inputSeed;
+}