about summary refs log tree commit diff stats
path: root/lib/default.nix
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/default.nix69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/default.nix b/lib/default.nix
new file mode 100644
index 00000000..80227cf4
--- /dev/null
+++ b/lib/default.nix
@@ -0,0 +1,69 @@
+{lib}: let
+  /*
+  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);
+
+  /*
+  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";
+in {
+  inherit binaryToDecimal pow;
+}