{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; }