blob: 3fe7c04618c3463e16a897e58f7a7c3f507c3d8e (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
{ depot, lib, ... }:
let
inherit (depot.users.sterni.nix.char)
chr
ord
;
inherit (depot.users.sterni.nix)
int
flow
;
take = n: s:
builtins.substring 0 n s;
drop = n: s:
builtins.substring n int.maxBound s;
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:
flow.cond [
[ (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;
# pattern matching for strings only
match = val: matcher: matcher."${val}";
in {
inherit
take
drop
charAt
charIndex
toBytes
fromBytes
toChars
fromChars
pad
fit
match
;
}
|