aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-02-02 18:04:29 +0100
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-02-02 18:25:02 +0100
commite3fff1e291dbdfe2a5258bcc645cd532b18adabd (patch)
tree1a751248335f386f7b58b9c25cbe28c8ec5e0069 /lib
parentbuild(build.sh): Allow passing arguments to nix (diff)
downloadnixos-config-e3fff1e291dbdfe2a5258bcc645cd532b18adabd.zip
feat(lib): Init `baseLib`
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;
+}