diff options
author | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-02-02 18:04:29 +0100 |
---|---|---|
committer | Benedikt Peetz <benedikt.peetz@b-peetz.de> | 2025-02-02 18:25:02 +0100 |
commit | e3fff1e291dbdfe2a5258bcc645cd532b18adabd (patch) | |
tree | 1a751248335f386f7b58b9c25cbe28c8ec5e0069 /lib | |
parent | build(build.sh): Allow passing arguments to nix (diff) | |
download | nixos-config-e3fff1e291dbdfe2a5258bcc645cd532b18adabd.zip |
feat(lib): Init `baseLib`
Diffstat (limited to '')
-rw-r--r-- | lib/default.nix | 69 |
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; +} |