Skip to content

Commit 5663d9c

Browse files
committed
add zerover
1 parent 8dff8d4 commit 5663d9c

8 files changed

Lines changed: 211 additions & 73 deletions

File tree

Justfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ help:
44
docs:
55
cd docs && pnpm run dev
66

7+
zerover:
8+
echo "obase=2; $(date +%s)" | bc
9+
710
fmt *args:
811
treefmt {{args}}
912

README.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,28 @@ Every lens either refines its input (`right`) or returns the original unchanged
2020
Bend’s combinator names deliberately match parser-combinator vocabulary:
2121
This is not cosmetic. The names signal that [Bend is a parser combinator library](https://bend.denful.dev/explanation/validation-is-parsing), one that operates on Nix data structures instead of character streams, and that happens to also support bidirectional writes.
2222

23-
## **[Documentation](https://bend.denfun.dev)**
23+
**[Read the Documentation Website](https://bend.denfun.dev)**
2424

2525
## Install
2626

27+
Bend has no dependencies
28+
2729
```nix
30+
# flake.nix
2831
inputs.bend.url = "github:denful/bend";
29-
30-
...
31-
3232
bend = inputs.bend.lib;
3333
```
3434

35+
```nix
36+
# default.nix
37+
bend = import bend-sources.outPath;
38+
```
39+
40+
## [zer0ver](https://0ver.org)
41+
42+
Bend uses 0-based versioning. `0.<binary-epoch-of-release>`
43+
44+
```shell
45+
# same as `just zerover`
46+
echo "obase=2; $(date +%s)" | bc
47+
```

nix/extras.nix

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,11 @@ let
66
inBounds = l: builtins.isList l && builtins.length l > n && n >= 0;
77
in
88
{
9-
get =
10-
l:
11-
if inBounds l then
12-
bend.right (builtins.elemAt l n)
13-
else
14-
bend.left l;
9+
get = l: if inBounds l then bend.right (builtins.elemAt l n) else bend.left l;
1510
set =
1611
l: v:
1712
if inBounds l then
18-
bend.right (
19-
builtins.genList (i: if i == n then v else builtins.elemAt l i) (builtins.length l)
20-
)
13+
bend.right (builtins.genList (i: if i == n then v else builtins.elemAt l i) (builtins.length l))
2114
else
2215
bend.left l;
2316
};
@@ -78,10 +71,7 @@ let
7871
results = map lens.get s;
7972
hasError = builtins.any (r: r ? left) results;
8073
in
81-
if hasError then
82-
bend.left results
83-
else
84-
bend.right (map (r: r.right) results);
74+
if hasError then bend.left results else bend.right (map (r: r.right) results);
8575
set =
8676
s: vs:
8777
if !builtins.isList s || !builtins.isList vs || builtins.length s != builtins.length vs then
@@ -92,51 +82,66 @@ let
9282
results = builtins.genList (i: lens.get (builtins.elemAt vs i)) n;
9383
hasError = builtins.any (r: r ? left) results;
9484
in
95-
if hasError then
96-
bend.left results
97-
else
98-
bend.right (map (r: r.right) results);
85+
if hasError then bend.left results else bend.right (map (r: r.right) results);
9986
};
10087

10188
atLeast = n: lens: {
10289
get =
10390
s:
104-
if !builtins.isList s then bend.left s
105-
else if builtins.length s < n then bend.left s
106-
else (each lens).get s;
91+
if !builtins.isList s then
92+
bend.left s
93+
else if builtins.length s < n then
94+
bend.left s
95+
else
96+
(each lens).get s;
10797
set =
10898
s: vs:
109-
if !builtins.isList s then bend.left s
110-
else if builtins.length s < n then bend.left s
111-
else (each lens).set s vs;
99+
if !builtins.isList s then
100+
bend.left s
101+
else if builtins.length s < n then
102+
bend.left s
103+
else
104+
(each lens).set s vs;
112105
};
113106

114107
some = lens: atLeast 1 lens;
115108

116109
many = lens: {
117110
get =
118111
s:
119-
if !builtins.isList s then bend.left s
120-
else if s == [ ] then bend.right [ ]
121-
else (each lens).get s;
112+
if !builtins.isList s then
113+
bend.left s
114+
else if s == [ ] then
115+
bend.right [ ]
116+
else
117+
(each lens).get s;
122118
set =
123119
s: vs:
124-
if !builtins.isList s || !builtins.isList vs then bend.left s
125-
else if s == [ ] && vs == [ ] then bend.right [ ]
126-
else (each lens).set s vs;
120+
if !builtins.isList s || !builtins.isList vs then
121+
bend.left s
122+
else if s == [ ] && vs == [ ] then
123+
bend.right [ ]
124+
else
125+
(each lens).set s vs;
127126
};
128127

129128
exactly = n: lens: {
130129
get =
131130
s:
132-
if !builtins.isList s then bend.left s
133-
else if builtins.length s != n then bend.left s
134-
else (each lens).get s;
131+
if !builtins.isList s then
132+
bend.left s
133+
else if builtins.length s != n then
134+
bend.left s
135+
else
136+
(each lens).get s;
135137
set =
136138
s: vs:
137-
if !builtins.isList s then bend.left s
138-
else if builtins.length s != n then bend.left s
139-
else (each lens).set s vs;
139+
if !builtins.isList s then
140+
bend.left s
141+
else if builtins.length s != n then
142+
bend.left s
143+
else
144+
(each lens).set s vs;
140145
};
141146

142147
mapKey = f: {

shell.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ pkgs.mkShell {
1010
pkgs.just
1111
pkgs.nodejs
1212
pkgs.pnpm
13+
pkgs.bc
1314
];
1415
}

tests.nix

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,5 @@ in
2020
// (import ./tests/predicate.nix bend)
2121
// (import ./tests/higher-order.nix bend)
2222
// (import ./tests/extras.nix bend)
23-
// (import ./tests/debug.nix bend)
24-
;
23+
// (import ./tests/debug.nix bend);
2524
}

0 commit comments

Comments
 (0)