Skip to content

Commit baed4e6

Browse files
isaacabrahamTheAngryByrd
authored andcommitted
Refactor traverseValidationARev (perf).
1 parent 51d0fe8 commit baed4e6

File tree

1 file changed

+24
-21
lines changed

1 file changed

+24
-21
lines changed

src/FsToolkit.ErrorHandling/List.fs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,35 @@ module List =
66
let rec private traverseResultM' (state : Result<_,_>) (f : _ -> Result<_,_>) xs =
77
match xs with
88
| [] -> state
9-
| x :: xs ->
9+
| x :: xs ->
1010
let r = result {
1111
let! y = f x
1212
let! ys = state
1313
return ys @ [y]
14-
}
14+
}
1515
match r with
1616
| Ok _ -> traverseResultM' r f xs
1717
| Error _ -> r
1818

1919
let rec private traverseAsyncResultM' (state : Async<Result<_,_>>) (f : _ -> Async<Result<_,_>>) xs =
2020
match xs with
2121
| [] -> state
22-
| x :: xs ->
22+
| x :: xs ->
2323
async {
2424
let! r = asyncResult {
2525
let! ys = state
2626
let! y = f x
2727
return ys @ [y]
28-
}
28+
}
2929
match r with
30-
| Ok _ ->
30+
| Ok _ ->
3131
return! traverseAsyncResultM' (Async.singleton r) f xs
3232
| Error _ -> return r
3333
}
3434

3535
let traverseResultM f xs =
3636
traverseResultM' (Ok []) f xs
37-
37+
3838
let sequenceResultM xs =
3939
traverseResultM id xs
4040

@@ -43,20 +43,20 @@ module List =
4343

4444
let sequenceAsyncResultM xs =
4545
traverseAsyncResultM id xs
46-
46+
4747

4848
let rec private traverseResultA' state f xs =
4949
match xs with
5050
| [] -> state
5151
| x :: xs ->
52-
let fR =
52+
let fR =
5353
f x |> Result.mapError List.singleton
5454
match state, fR with
55-
| Ok ys, Ok y ->
55+
| Ok ys, Ok y ->
5656
traverseResultA' (Ok (ys @ [y])) f xs
57-
| Error errs, Error e ->
57+
| Error errs, Error e ->
5858
traverseResultA' (Error (errs @ e)) f xs
59-
| Ok _, Error e | Error e , Ok _ ->
59+
| Ok _, Error e | Error e , Ok _ ->
6060
traverseResultA' (Error e) f xs
6161

6262
let rec private traverseAsyncResultA' state f xs =
@@ -67,11 +67,11 @@ module List =
6767
let! s = state
6868
let! fR = f x |> AsyncResult.mapError List.singleton
6969
match s, fR with
70-
| Ok ys, Ok y ->
70+
| Ok ys, Ok y ->
7171
return! traverseAsyncResultA' (AsyncResult.retn (ys @ [y])) f xs
72-
| Error errs, Error e ->
72+
| Error errs, Error e ->
7373
return! traverseAsyncResultA' (AsyncResult.returnError (errs @ e)) f xs
74-
| Ok _, Error e | Error e , Ok _ ->
74+
| Ok _, Error e | Error e , Ok _ ->
7575
return! traverseAsyncResultA' (AsyncResult.returnError e) f xs
7676
}
7777

@@ -82,16 +82,19 @@ module List =
8282
traverseResultA id xs
8383

8484
let rec traverseValidationA' state f xs =
85-
match xs with
86-
| [] -> state
87-
| x :: xs ->
85+
match state, xs with
86+
| Ok items, [] ->
87+
Ok (List.rev items)
88+
| errors, [] ->
89+
errors
90+
| _, x :: xs ->
8891
let fR = f x
8992
match state, fR with
90-
| Ok ys, Ok y ->
91-
traverseValidationA' (Ok (ys @ [y])) f xs
92-
| Error errs1, Error errs2 ->
93+
| Ok ys, Ok y ->
94+
traverseValidationA' (Ok (y :: ys)) f xs
95+
| Error errs1, Error errs2 ->
9396
traverseValidationA' (Error (errs2 @ errs1)) f xs
94-
| Ok _, Error errs | Error errs, Ok _ ->
97+
| Ok _, Error errs | Error errs, Ok _ ->
9598
traverseValidationA' (Error errs) f xs
9699

97100
let traverseValidationA f xs =

0 commit comments

Comments
 (0)