57 lines
1.2 KiB
Nix
57 lines
1.2 KiB
Nix
{ lib }:
|
|
let
|
|
inherit (builtins) elemAt genList;
|
|
inherit (lib) mod;
|
|
in
|
|
rec {
|
|
# Power of 2 calculation
|
|
# pow2 n returns 2^n
|
|
pow2 =
|
|
n:
|
|
if n == 0 then
|
|
1
|
|
else if n == 1 then
|
|
2
|
|
else
|
|
let
|
|
half = n / 2;
|
|
halfPow = pow2 half;
|
|
in
|
|
halfPow * halfPow * (if mod n 2 == 1 then 2 else 1);
|
|
|
|
# Convert list of 4 octets to 32-bit integer
|
|
# [192 168 1 1] -> 3232235777
|
|
octetsToInt =
|
|
octets:
|
|
let
|
|
a = elemAt octets 0;
|
|
b = elemAt octets 1;
|
|
c = elemAt octets 2;
|
|
d = elemAt octets 3;
|
|
in
|
|
a * 16777216 + b * 65536 + c * 256 + d;
|
|
|
|
# Convert 32-bit integer to list of 4 octets
|
|
# 3232235777 -> [192 168 1 1]
|
|
intToOctets =
|
|
ip:
|
|
let
|
|
a = ip / 16777216;
|
|
remainder1 = mod ip 16777216;
|
|
b = remainder1 / 65536;
|
|
remainder2 = mod remainder1 65536;
|
|
c = remainder2 / 256;
|
|
d = mod remainder2 256;
|
|
in
|
|
[
|
|
a
|
|
b
|
|
c
|
|
d
|
|
];
|
|
|
|
# Generate a list of integers from start to end (inclusive)
|
|
# More efficient than recursive approach for large ranges
|
|
intRange = start: end: if end < start then [ ] else genList (i: start + i) (end - start + 1);
|
|
}
|