{ ... }: let inherit(builtins) bitAnd bitOr bitXor elemAt foldl' genList; splitInteger = value: let value0 = if value >= 0 then value else -value; value1 = value0 / 256; value2 = value1 / 256; value3 = value2 / 256; value4 = value3 / 256; value5 = value4 / 256; value6 = value5 / 256; value7 = value6 / 256; in { sign = value < 0; byte0 = bitAnd value0 255; byte1 = bitAnd value1 255; byte2 = bitAnd value2 255; byte3 = bitAnd value3 255; byte4 = bitAnd value4 255; byte5 = bitAnd value5 255; byte6 = bitAnd value6 255; byte7 = bitAnd value7 255; word0 = bitAnd value0 65535; word1 = bitAnd value2 65535; word2 = bitAnd value4 65535; word3 = bitAnd value6 65535; dword0 = bitAnd value0 4294967295; dword1 = bitAnd value4 4294967295; }; in { unpackWord = value: { inherit(splitInteger value) byte0 byte1; }; unpackDWord = value: { inherit(splitInteger value) byte0 byte1 byte2 byte3; }; unpackQWord = value: { inherit(splitInteger value) byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7; }; packWord = { byte0 ? 0, byte1 ? 0, }: assert byte0 >= 0 && byte0 < 255; assert byte1 >= 0 && byte1 < 255; byte0 + byte1 * 256; packDWord = { byte0 ? 0, byte1 ? 0, byte2 ? 0, byte3 ? 0, }: assert byte0 >= 0 && byte0 < 255; assert byte1 >= 0 && byte1 < 255; assert byte2 >= 0 && byte2 < 255; assert byte3 >= 0 && byte3 < 255; fold' (result: byte: result * 256 + byte) byte3 [ byte2 byte1 byte0 ]; packQWord = { byte0 ? 0, byte1 ? 0, byte2 ? 0, byte3 ? 0, byte4 ? 0, byte5 ? 0, byte6 ? 0, byte7 ? 0, }: assert byte0 >= 0 && byte0 < 255; assert byte1 >= 0 && byte1 < 255; assert byte2 >= 0 && byte2 < 255; assert byte3 >= 0 && byte3 < 255; assert byte4 >= 0 && byte4 < 255; assert byte5 >= 0 && byte5 < 255; assert byte6 >= 0 && byte6 < 255; assert byte7 >= 0 && byte7 < 255; fold' (result: byte: result * 256 + byte) byte7 [ byte6 byte5 byte4 byte3 byte2 byte1 byte0 ]; }