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 ] ```
This commit is contained in:
parent
d0c12dc612
commit
00022fbeda
|
@ -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
|
||||
|
|
|
@ -102,6 +102,16 @@ runTests {
|
|||
expected = 9;
|
||||
};
|
||||
|
||||
testToHex = {
|
||||
expr = toHex 250;
|
||||
expected = "FA";
|
||||
};
|
||||
|
||||
testToBase = {
|
||||
expr = toBase 2 6;
|
||||
expected = [ 1 1 0 ];
|
||||
};
|
||||
|
||||
# STRINGS
|
||||
|
||||
testConcatMapStrings = {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue