{ lib ? (import {}).lib }: let # ord-data.nix is an auto generated nix file # which contains single byte strings from # 0x01 to 0xff in a list where there index # is equal to their byte-value. # # The string at index 0 is empty because nix # apparently thinks a NUL byte is EOF. ordData = import ./ord-data.nix; inherit (lib) stringToCharacters concatMapStrings ; inherit (builtins) map elemAt ; elemIndex = e: l: let tailCall = e: l: i: if l == [] then -1 else if builtins.head l == e then i else tailCall e (builtins.tail l) (i + 1); in tailCall e l 0; ord = char: let i = elemIndex char ordData; in if i == -1 then 0 else i; # can't have a NUL byte in a string apparently chr = i: if i < 1 || i > 255 then throw "chr: only 0x01-0xff is supported" else elemAt ordData i; stringToIntegers = str: map ord (stringToCharacters str); integersToString = is: concatMapStrings chr is; in { inherit ord chr stringToIntegers integersToString ; }