summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBas van Dijk <v.dijk.bas@gmail.com>2020-04-20 12:00:23 +0200
committerBas van Dijk <v.dijk.bas@gmail.com>2020-07-20 13:09:26 +0200
commit00022fbeda385d7b6ae2eee44f07eecfc6d92015 (patch)
treeb542e068d7d85058445cadd1e495c349d6eb4ad3 /lib
parentd0c12dc612bef680d129df40cbe7d80981a1e51c (diff)
lib: add the toHex and toBase utility functions
`toHex` converts the given positive integer to a string of the hexadecimal representation of that integer. For example: ``` toHex 0 => "0" toHex 16 => "10" toHex 250 => "FA" ``` `toBase base i` converts the positive integer `i` to a list of it digits in the given `base`. For example: ``` toBase 10 123 => [ 1 2 3 ] toBase 2 6 => [ 1 1 0 ] toBase 16 250 => [ 15 10 ] ```
Diffstat (limited to 'lib')
-rw-r--r--lib/default.nix2
-rw-r--r--lib/tests/misc.nix10
-rw-r--r--lib/trivial.nix51
3 files changed, 62 insertions, 1 deletions
diff --git a/lib/default.nix b/lib/default.nix
index 7387e9d9f1ff..a5c768ff407c 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -67,7 +67,7 @@ let
inherit (trivial) id const pipe concat or and bitAnd bitOr bitXor
bitNot boolToString mergeAttrs flip mapNullable inNixShell min max
importJSON warn info showWarnings nixpkgsVersion version mod compare
- splitByAndCompare functionArgs setFunctionArgs isFunction;
+ splitByAndCompare functionArgs setFunctionArgs isFunction toHex toBase;
inherit (fixedPoints) fix fix' converge extends composeExtensions
makeExtensible makeExtensibleWithCustomName;
inherit (attrsets) attrByPath hasAttrByPath setAttrByPath
diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix
index 36ddd186d7b7..7d38b56bc211 100644
--- a/lib/tests/misc.nix
+++ b/lib/tests/misc.nix
@@ -102,6 +102,16 @@ runTests {
expected = 9;
};
+ testToHex = {
+ expr = toHex 250;
+ expected = "FA";
+ };
+
+ testToBase = {
+ expr = toBase 2 6;
+ expected = [ 1 1 0 ];
+ };
+
# STRINGS
testConcatMapStrings = {
diff --git a/lib/trivial.nix b/lib/trivial.nix
index 5788dd435e59..1114e94b5230 100644
--- a/lib/trivial.nix
+++ b/lib/trivial.nix
@@ -332,4 +332,55 @@ rec {
*/
isFunction = f: builtins.isFunction f ||
(f ? __functor && isFunction (f.__functor f));
+
+ /* Convert the given positive integer to a string of its hexadecimal
+ representation. For example:
+
+ toHex 0 => "0"
+
+ toHex 16 => "10"
+
+ toHex 250 => "FA"
+ */
+ toHex = i:
+ let
+ toHexDigit = d:
+ if d < 10
+ then toString d
+ else
+ {
+ "10" = "A";
+ "11" = "B";
+ "12" = "C";
+ "13" = "D";
+ "14" = "E";
+ "15" = "F";
+ }.${toString d};
+ in
+ lib.concatMapStrings toHexDigit (toBase 16 i);
+
+ /* `toBase base i` converts the positive integer i to a list of its
+ digits in the given base. For example:
+
+ toBase 10 123 => [ 1 2 3 ]
+
+ toBase 2 6 => [ 1 1 0 ]
+
+ toBase 16 250 => [ 15 10 ]
+ */
+ toBase = base: i:
+ let
+ go = i:
+ if i < base
+ then [i]
+ else
+ let
+ r = i - ((i / base) * base);
+ q = (i - r) / base;
+ in
+ [r] ++ go q;
+ in
+ assert (base >= 2);
+ assert (i >= 0);
+ lib.reverseList (go i);
}