Skip to content

Commit 3bb9da1

Browse files
committed
refactor(validate): validate pred bakes identity, validateWith pred lens for custom lens
1 parent 0b7f244 commit 3bb9da1

4 files changed

Lines changed: 19 additions & 14 deletions

File tree

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ Both `left` and `right` hold structured data, the library provides combinators f
4040
let lens = bend.pipe [
4141
(bend.attr "name")
4242
bend.str
43-
(bend.validate (s: s != "") bend.identity)
43+
(bend.validate (s: s != ""))
4444
];
4545
in
4646
lens.get { name = "alice"; } # right "alice"
@@ -230,7 +230,8 @@ in (bend.ensure validPort "invalid port" bend.int).get 80 # right 80
230230
| `focus getF setF` | lift pure get/set into a lens |
231231
| `parse fmap lens` | apply fmap to focused value |
232232
| `map f lens` | transform focused value with pure function |
233-
| `validate pred lens` | left when pred fails |
233+
| `validate pred` | left when pred fails, focuses raw value |
234+
| `validateWith pred lens` | left when pred fails, with custom lens |
234235
| `withDefault d lens` | replace left with `right d` |
235236
| `recover f lens` | call f on left to attempt recovery |
236237
| `alt lensA lensB` | try lensA, fall back to lensB |

default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ let
3838
inherit (parsers)
3939
map
4040
validate
41+
validateWith
4142
int
4243
str
4344
bool

nix/parsers.nix

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ either: adapt: parse: identity:
22
let
33
map = f: parse (a: either.right (f a));
44

5-
validate = pred: parse (a: if pred a then either.right a else either.left a);
5+
validateWith = pred: parse (a: if pred a then either.right a else either.left a);
66

7-
typeParser = pred: parse (a: if pred a then either.right a else either.left a) identity;
7+
validate = pred: validateWith pred identity;
8+
9+
typeParser = validate;
810

911
int = typeParser builtins.isInt;
1012
str = typeParser builtins.isString;
@@ -34,6 +36,7 @@ in
3436
inherit
3537
map
3638
validate
39+
validateWith
3740
int
3841
str
3942
bool

tests.nix

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -312,12 +312,12 @@ in
312312
};
313313

314314
validate."test-get-pred-pass-returns-right-same-value" = {
315-
expr = (bend.validate (x: x > 0) bend.identity).get 5;
315+
expr = (bend.validate (x: x > 0)).get 5;
316316
expected = bend.right 5;
317317
};
318318

319319
validate."test-get-pred-fail-returns-left-same-value" = {
320-
expr = (bend.validate (x: x > 0) bend.identity).get (-1);
320+
expr = (bend.validate (x: x > 0)).get (-1);
321321
expected = bend.left (-1);
322322
};
323323

@@ -484,7 +484,7 @@ in
484484
lens = bend.pipe [
485485
(bend.attr "name")
486486
bend.str
487-
(bend.validate (s: s != "") bend.identity)
487+
(bend.validate (s: s != ""))
488488
];
489489
in
490490
lens.get { name = "alice"; };
@@ -497,7 +497,7 @@ in
497497
lens = bend.pipe [
498498
(bend.attr "name")
499499
bend.str
500-
(bend.validate (s: s != "") bend.identity)
500+
(bend.validate (s: s != ""))
501501
];
502502
in
503503
lens.get { name = ""; };
@@ -640,7 +640,7 @@ in
640640
apply."test-apply-with-validation" = {
641641
expr =
642642
let
643-
lens = bend.compose (bend.apply ({ x, y }: x + y)) (bend.validate (n: n > 20) bend.identity);
643+
lens = bend.compose (bend.apply ({ x, y }: x + y)) (bend.validate (n: n > 20));
644644
in
645645
lens.get {
646646
x = 15;
@@ -652,7 +652,7 @@ in
652652
apply."test-apply-validation-fails" = {
653653
expr =
654654
let
655-
lens = bend.compose (bend.apply ({ x, y }: x + y)) (bend.validate (n: n > 30) bend.identity);
655+
lens = bend.compose (bend.apply ({ x, y }: x + y)) (bend.validate (n: n > 30));
656656
in
657657
lens.get {
658658
x = 15;
@@ -915,7 +915,7 @@ in
915915
let
916916
lens = bend.transform {
917917
x = bend.int;
918-
y = bend.validate (s: builtins.stringLength s > 3) bend.str;
918+
y = bend.validateWith (s: builtins.stringLength s > 3) bend.str;
919919
};
920920
in
921921
lens.get {
@@ -933,7 +933,7 @@ in
933933
let
934934
lens = bend.transform {
935935
x = bend.int;
936-
y = bend.validate (s: builtins.stringLength s > 3) bend.str;
936+
y = bend.validateWith (s: builtins.stringLength s > 3) bend.str;
937937
};
938938
in
939939
lens.get {
@@ -1541,11 +1541,11 @@ in
15411541
expected = true;
15421542
};
15431543
predicate."test-andP-with-validate" = {
1544-
expr = (bend.validate (bend.andP (x: x > 0) (x: x < 100)) bend.identity).get 50;
1544+
expr = (bend.validate (bend.andP (x: x > 0) (x: x < 100))).get 50;
15451545
expected = bend.right 50;
15461546
};
15471547
predicate."test-andP-with-validate-fails" = {
1548-
expr = (bend.validate (bend.andP (x: x > 0) (x: x < 100)) bend.identity).get 150;
1548+
expr = (bend.validate (bend.andP (x: x > 0) (x: x < 100))).get 150;
15491549
expected = bend.left 150;
15501550
};
15511551
predicate."test-orP-with-ensure" = {

0 commit comments

Comments
 (0)