nixos-config/subprojects/bahaghari/lib/hex.nix
Gabriel Arazas 66b35ea2c6
bahaghari: update library arguments
It makes it confusing sometimes. Not worth keeping the design.
2024-03-02 18:10:21 +08:00

90 lines
1.8 KiB
Nix

# A small utility library for manipulating hexadecimal numbers. It's made in 15
# minutes with a bunch of duct tape on it but it's working for its intended
# purpose.
{ pkgs, lib, self }:
let
glyphList =
[
"0"
"1"
"2"
"3"
"4"
"5"
"6"
"7"
"8"
"9"
"A"
"B"
"C"
"D"
"E"
"F"
];
baseSet = self.generateBaseDigitType glyphList;
in
rec {
/* Returns a convenient glyph set for creating your own conversion or
hex-related functions.
*/
inherit (baseSet) glyphSet conversionTable fromDec toDec;
/* A variant of `lib.lists.range` function just with hexadecimal digits.
Type: range :: Int -> Int -> [ String ]
Example:
range 15 18
=> [ "F" "10" "11" ]
*/
range = first: last:
builtins.map (n: baseSet.fromDec n) (lib.lists.range first last);
/* Checks if the given hex string is valid or not.
Type: isHexString :: String -> Bool
Example:
isHexString "ABC"
=> true
isHexString "00ABC"
=> true
isHexString "WHAT! HELL NO!"
=> false
*/
isHexString = hex:
builtins.match "[A-Fa-f0-9]+" hex != null;
/* Left pads the given hex number with the given number of max amount of
digits. It will throw an error if it's not a hex string.
Type: pad :: Int -> String -> String
Example:
pad 2 "A"
=> "0A"
pad 1 "ABC"
=> "ABC"
pad -2 "ABC"
=> "ABC"
*/
pad = n: hex:
let
strLength = lib.stringLength hex;
reqWidth = n - strLength;
components = lib.genList (_: "0") reqWidth ++ [ hex ];
in
assert lib.assertMsg (isHexString hex)
"bahaghariLib.hex.pad: given hex number (${hex}) is not valid";
if (reqWidth <= 0)
then hex
else lib.concatStringsSep "" components;
}