2021-02-22 14:32:45 +01:00
|
|
|
{ depot, lib, ... }:
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
inherit (depot.users.sterni.nix.char)
|
|
|
|
chr
|
|
|
|
ord
|
|
|
|
;
|
|
|
|
|
2021-03-04 12:29:26 +01:00
|
|
|
inherit (depot.users.sterni.nix)
|
|
|
|
int
|
|
|
|
flow
|
2021-02-22 14:32:45 +01:00
|
|
|
;
|
|
|
|
|
|
|
|
take = n: s:
|
|
|
|
builtins.substring 0 n s;
|
|
|
|
|
|
|
|
drop = n: s:
|
2021-03-04 12:29:26 +01:00
|
|
|
builtins.substring n int.maxBound s;
|
2021-02-22 14:32:45 +01:00
|
|
|
|
|
|
|
charAt = i: s:
|
|
|
|
let
|
|
|
|
r = builtins.substring i 1 s;
|
|
|
|
in if r == "" then null else r;
|
|
|
|
|
|
|
|
charIndex = char: s:
|
|
|
|
let
|
|
|
|
len = builtins.stringLength s;
|
|
|
|
go = i:
|
2021-03-04 12:29:26 +01:00
|
|
|
flow.cond [
|
2021-02-22 14:32:45 +01:00
|
|
|
[ (i >= len) null ]
|
|
|
|
[ (charAt i s == char) i ]
|
|
|
|
[ true (go (i + 1)) ]
|
|
|
|
];
|
|
|
|
in go 0;
|
|
|
|
|
|
|
|
toChars = lib.stringToCharacters;
|
|
|
|
fromChars = lib.concatStrings;
|
|
|
|
|
|
|
|
toBytes = str:
|
|
|
|
builtins.map ord (toChars str);
|
|
|
|
|
|
|
|
fromBytes = is: lib.concatMapStrings chr is;
|
|
|
|
|
|
|
|
pad = { left ? 0, right ? 0, char ? " " }: s:
|
|
|
|
let
|
|
|
|
leftS = fromChars (builtins.genList (_: char) left);
|
|
|
|
rightS = fromChars (builtins.genList (_: char) right);
|
|
|
|
in "${leftS}${s}${rightS}";
|
|
|
|
|
|
|
|
fit = { char ? " ", width, side ? "left" }: s:
|
|
|
|
let
|
|
|
|
diff = width - builtins.stringLength s;
|
|
|
|
in
|
|
|
|
if diff <= 0
|
|
|
|
then s
|
|
|
|
else pad { inherit char; "${side}" = diff; } s;
|
|
|
|
|
2021-03-03 01:57:00 +01:00
|
|
|
# pattern matching for strings only
|
|
|
|
match = val: matcher: matcher."${val}";
|
|
|
|
|
2021-02-22 14:32:45 +01:00
|
|
|
in {
|
|
|
|
inherit
|
|
|
|
take
|
|
|
|
drop
|
|
|
|
charAt
|
|
|
|
charIndex
|
|
|
|
toBytes
|
|
|
|
fromBytes
|
|
|
|
toChars
|
|
|
|
fromChars
|
|
|
|
pad
|
|
|
|
fit
|
2021-03-03 01:57:00 +01:00
|
|
|
match
|
2021-02-22 14:32:45 +01:00
|
|
|
;
|
|
|
|
}
|