Skip to content

Commit

Permalink
Fixing List.traverseResultA issues
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAngryByrd committed Oct 18, 2022
1 parent ed43d87 commit d4e7288
Show file tree
Hide file tree
Showing 7 changed files with 264 additions and 265 deletions.
466 changes: 233 additions & 233 deletions FsToolkit.ErrorHandling.sln

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src/FsToolkit.ErrorHandling.JobResult/JobResult.fs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ module JobResult =
let inline foldResult ([<InlineIfLambda>] onSuccess) ([<InlineIfLambda>] onError) jr =
Job.map (Result.fold onSuccess onError) jr

let inline eitherMap ([<InlineIfLambda>] onSuccess) ([<InlineIfLambda>] onError) jr =
Job.map (Result.eitherMap onSuccess onError) jr

let inline ofAsync aAsync =
aAsync
|> Job.fromAsync
Expand Down
13 changes: 6 additions & 7 deletions src/FsToolkit.ErrorHandling.JobResult/List.fs
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,22 @@ module List =
let sequenceJobResultM xs = traverseJobResultM id xs


let rec private traverseJobResultA' state f xs =
let rec private traverseJobResultA' state (f : _ -> Job<Result<_,_>>) xs =
match xs with
| [] ->
state
|> JobResult.map List.rev
|> JobResult.eitherMap List.rev List.rev
| x :: xs -> job {
let! s = state

let! fR =
f x
|> JobResult.mapError List.singleton
let! fR = f x


match s, fR with
| Ok ys, Ok y -> return! traverseJobResultA' (JobResult.retn (y :: ys)) f xs
| Error errs, Error e ->
return! traverseJobResultA' (JobResult.returnError (errs @ e)) f xs
| Ok _, Error e
return! traverseJobResultA' (JobResult.returnError (e :: errs)) f xs
| Ok _, Error e -> return! traverseJobResultA' (JobResult.returnError [e]) f xs
| Error e, Ok _ -> return! traverseJobResultA' (JobResult.returnError e) f xs
}

Expand Down
9 changes: 5 additions & 4 deletions src/FsToolkit.ErrorHandling.TaskResult/Task.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,11 @@ module Task =
value
|> Task.FromResult

let inline bind ([<InlineIfLambda>] f: 'a -> Task<'b>) (x: Task<'a>) = task {
let! x = x
return! f x
}
let inline bind ([<InlineIfLambda>] f: 'a -> Task<'b>) (x: Task<'a>) =
task {
let! x = x
return! f x
}

let inline bindV ([<InlineIfLambda>] f: 'a -> Task<'b>) (x: ValueTask<'a>) = task {
let! x = x
Expand Down
3 changes: 3 additions & 0 deletions src/FsToolkit.ErrorHandling/AsyncResult.fs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ module AsyncResult =
: Async<'output> =
Async.map (Result.either onSuccess onError) input

let inline eitherMap ([<InlineIfLambda>] onSuccess) ([<InlineIfLambda>] onError) input =
Async.map (Result.eitherMap onSuccess onError) input

#if !FABLE_COMPILER

let inline ofTask (aTask: Task<'ok>) : Async<Result<'ok, exn>> =
Expand Down
34 changes: 13 additions & 21 deletions src/FsToolkit.ErrorHandling/List.fs
Original file line number Diff line number Diff line change
Expand Up @@ -51,38 +51,30 @@ module List =


let rec private traverseResultA' state f xs =
match xs with
| [] ->
state
|> Result.map List.rev
| x :: xs ->
let fR =
f x
|> Result.mapError List.singleton
match xs with
| [] -> state |> Result.eitherMap List.rev List.rev
| x :: xs ->

match state, fR with
| Ok ys, Ok y -> traverseResultA' (Ok(y :: ys)) f xs
| Error errs, Error e -> traverseResultA' (Error(errs @ e)) f xs
| Ok _, Error e
| Error e, Ok _ -> traverseResultA' (Error e) f xs
match state, f x with
| Ok ys, Ok y -> traverseResultA' (Ok(y :: ys)) f xs
| Error errs, Error e -> traverseResultA' (Error(e :: errs)) f xs
| Ok _, Error e -> traverseResultA' (Error [e]) f xs
| Error e, Ok _ -> traverseResultA' (Error e) f xs

let rec private traverseAsyncResultA' state f xs =
match xs with
| [] ->
state
|> AsyncResult.map List.rev
|> AsyncResult.eitherMap List.rev List.rev

| x :: xs -> async {
let! s = state

let! fR =
f x
|> AsyncResult.mapError List.singleton

let! fR = f x
match s, fR with
| Ok ys, Ok y -> return! traverseAsyncResultA' (AsyncResult.retn (y :: ys)) f xs
| Error errs, Error e ->
return! traverseAsyncResultA' (AsyncResult.returnError (errs @ e)) f xs
| Ok _, Error e
return! traverseAsyncResultA' (AsyncResult.returnError (e :: errs)) f xs
| Ok _, Error e -> return! traverseAsyncResultA' (AsyncResult.returnError [e]) f xs
| Error e, Ok _ -> return! traverseAsyncResultA' (AsyncResult.returnError e) f xs
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ open System.Threading.Tasks
open FSharp.Control.Tasks
#endif


[<Tests>]
let ``TaskResultCE return Tests`` =
testList "TaskResultCE Tests" [
Expand Down

0 comments on commit d4e7288

Please sign in to comment.