lib: import generally useful stuff from genipv6

This commit is contained in:
tv 2018-12-11 23:21:42 +01:00
parent e55b540928
commit 474e3e2e45
2 changed files with 31 additions and 28 deletions

View File

@ -112,6 +112,33 @@ let
(if test ".*::.*" a (if test ".*::.*" a
then a then a
else group-zeros (drop-leading-zeros a)); else group-zeros (drop-leading-zeros a));
hashToLength = n: s: substring 0 n (hashString "sha256" s);
dropLast = n: xs: reverseList (drop n (reverseList xs));
takeLast = n: xs: reverseList (take n (reverseList xs));
# Split string into list of chunks where each chunk is at most n chars long.
# The leftmost chunk might shorter.
# Example: stringToGroupsOf "123456" -> ["12" "3456"]
stringToGroupsOf = n: s: let
acc =
foldl'
(acc: c: if stringLength acc.chunk < n then {
chunk = acc.chunk + c;
chunks = acc.chunks;
} else {
chunk = c;
chunks = acc.chunks ++ [acc.chunk];
})
{
chunk = "";
chunks = [];
}
(stringToCharacters s);
in
filter (x: x != []) ([acc.chunk] ++ acc.chunks);
}; };
in in

View File

@ -26,7 +26,7 @@ let {
inherit subnetname; inherit subnetname;
subnetCIDR = "${subnetAddress}/${toString subnetPrefixLength}"; subnetCIDR = "${subnetAddress}/${toString subnetPrefixLength}";
subnetAddress = appendZeros subnetPrefixLength subnetPrefix; subnetAddress = appendZeros subnetPrefixLength subnetPrefix;
subnetHash = hash 4 subnetname; subnetHash = hashToLength 4 subnetname;
subnetPrefix = joinAddress netPrefix subnetHash; subnetPrefix = joinAddress netPrefix subnetHash;
subnetPrefixLength = netPrefixLength + 16; subnetPrefixLength = netPrefixLength + 16;
@ -34,7 +34,9 @@ let {
set = set =
concatStringsSep concatStringsSep
":" ":"
(stringToGroupsOf 4 (hash (suffixLength / 4) suffixSpec.hostName)); (stringToGroupsOf
4
(hashToLength (suffixLength / 4) suffixSpec.hostName));
string = suffixSpec; string = suffixSpec;
}; };
suffixLength = addressLength - subnetPrefixLength; suffixLength = addressLength - subnetPrefixLength;
@ -54,32 +56,6 @@ let {
in in
formatAddress (map (const "0") (range 1 zeroCount) ++ parsedaddr); formatAddress (map (const "0") (range 1 zeroCount) ++ parsedaddr);
# Split string into list of chunks where each chunk is at most n chars long.
# The leftmost chunk might shorter.
# Example: stringToGroupsOf "123456" -> ["12" "3456"]
stringToGroupsOf = n: s: let
acc =
foldl'
(acc: c: if stringLength acc.chunk < n then {
chunk = acc.chunk + c;
chunks = acc.chunks;
} else {
chunk = c;
chunks = acc.chunks ++ [acc.chunk];
})
{
chunk = "";
chunks = [];
}
(stringToCharacters s);
in
filter (x: x != []) ([acc.chunk] ++ acc.chunks);
hash = n: s: substring 0 n (hashString "sha256" s);
dropLast = n: xs: reverseList (drop n (reverseList xs));
takeLast = n: xs: reverseList (take n (reverseList xs));
hasEmptyPrefix = xs: take 2 xs == ["" ""]; hasEmptyPrefix = xs: take 2 xs == ["" ""];
hasEmptySuffix = xs: takeLast 2 xs == ["" ""]; hasEmptySuffix = xs: takeLast 2 xs == ["" ""];
hasEmptyInfix = xs: any (x: x == "") (trimEmpty 2 xs); hasEmptyInfix = xs: any (x: x == "") (trimEmpty 2 xs);