Skip to content

Commit 88e599d

Browse files
authored
Added AsyncResult and TaskResult Helpers (#245)
* Added more AsyncResult helpers * Added TaskResult helpers
1 parent 0935516 commit 88e599d

File tree

4 files changed

+295
-3
lines changed

4 files changed

+295
-3
lines changed

src/FsToolkit.ErrorHandling.TaskResult/TaskResult.fs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ module TaskResult =
260260
Result.requireNone error
261261
>> Task.singleton
262262
)
263-
263+
264264
/// Bind the TaskResult and requireValueSome on the inner voption value.
265265
let inline bindRequireValueSome error x =
266266
x
@@ -276,11 +276,66 @@ module TaskResult =
276276
Result.requireValueNone error
277277
>> Task.singleton
278278
)
279-
279+
280+
/// Bind the TaskResult and requireTrue on the inner value.
281+
let inline bindRequireTrue error x =
282+
x
283+
|> bind (
284+
Result.requireTrue error
285+
>> Task.singleton
286+
)
287+
288+
/// Bind the TaskResult and requireFalse on the inner value.
289+
let inline bindRequireFalse error x =
290+
x
291+
|> bind (
292+
Result.requireFalse error
293+
>> Task.singleton
294+
)
295+
296+
/// Bind the TaskResult and requireNotNull on the inner value.
297+
let inline bindRequireNotNull error x =
298+
x
299+
|> bind (
300+
Result.requireNotNull error
301+
>> Task.singleton
302+
)
303+
304+
/// Bind the TaskResult and requireEequal on the inner value.
305+
let inline bindRequireEqual y error x =
306+
x
307+
|> bind (fun x ->
308+
Result.requireEqual x y error
309+
|> Task.singleton
310+
)
311+
312+
/// Bind the TaskResult and requireEmpty on the inner value.
313+
let inline bindRequireEmpty error x =
314+
x
315+
|> bind (
316+
Result.requireEmpty error
317+
>> Task.singleton
318+
)
319+
320+
/// Bind the TaskResult and requireNotEmpty on the inner value.
321+
let inline bindRequireNotEmpty error x =
322+
x
323+
|> bind (
324+
Result.requireNotEmpty error
325+
>> Task.singleton
326+
)
327+
328+
/// Bind the TaskResult and requireHead on the inner value
329+
let inline bindRequireHead error x =
330+
x
331+
|> bind (
332+
Result.requireHead error
333+
>> Task.singleton
334+
)
335+
280336
let inline foldResult
281337
([<InlineIfLambda>] onSuccess: 'input -> 'output)
282338
([<InlineIfLambda>] onError: 'inputError -> 'output)
283339
(input: Task<Result<'input, 'inputError>>)
284340
: Task<'output> =
285341
Task.map (Result.either onSuccess onError) input
286-

src/FsToolkit.ErrorHandling/AsyncResult.fs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,3 +381,59 @@ module AsyncResult =
381381
Result.requireValueNone error
382382
>> Async.singleton
383383
)
384+
385+
/// Bind the AsyncResult and requireTrue on the inner value.
386+
let inline bindRequireTrue error x =
387+
x
388+
|> bind (
389+
Result.requireTrue error
390+
>> Async.singleton
391+
)
392+
393+
/// Bind the AsyncResult and requireFalse on the inner value.
394+
let inline bindRequireFalse error x =
395+
x
396+
|> bind (
397+
Result.requireFalse error
398+
>> Async.singleton
399+
)
400+
401+
/// Bind the AsyncResult and requireNotNull on the inner value.
402+
let inline bindRequireNotNull error x =
403+
x
404+
|> bind (
405+
Result.requireNotNull error
406+
>> Async.singleton
407+
)
408+
409+
/// Bind the AsyncResult and requireEequal on the inner value.
410+
let inline bindRequireEqual y error x =
411+
x
412+
|> bind (fun x ->
413+
Result.requireEqual x y error
414+
|> Async.singleton
415+
)
416+
417+
/// Bind the AsyncResult and requireEmpty on the inner value.
418+
let inline bindRequireEmpty error x =
419+
x
420+
|> bind (
421+
Result.requireEmpty error
422+
>> Async.singleton
423+
)
424+
425+
/// Bind the AsyncResult and requireNotEmpty on the inner value.
426+
let inline bindRequireNotEmpty error x =
427+
x
428+
|> bind (
429+
Result.requireNotEmpty error
430+
>> Async.singleton
431+
)
432+
433+
/// Bind the AsyncResult and requireHead on the inner value
434+
let inline bindRequireHead error x =
435+
x
436+
|> bind (
437+
Result.requireHead error
438+
>> Async.singleton
439+
)

tests/FsToolkit.ErrorHandling.TaskResult.Tests/TaskResult.fs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,3 +896,97 @@ let foldResultTests =
896896

897897
}
898898
]
899+
900+
[<Tests>]
901+
let taskResultBindRequireTrueTests =
902+
testList "TaskResult Bind + RequireTrue Tests" [
903+
testCaseTask "bindRequireTrue"
904+
<| fun _ ->
905+
task {
906+
do!
907+
true
908+
|> TaskResult.ok
909+
|> TaskResult.bindRequireTrue "Should be true"
910+
|> Expect.hasTaskOkValue ()
911+
}
912+
913+
testCaseTask "bindRequireFalse"
914+
<| fun _ ->
915+
task {
916+
do!
917+
false
918+
|> TaskResult.ok
919+
|> TaskResult.bindRequireFalse "Should be false"
920+
|> Expect.hasTaskOkValue ()
921+
}
922+
]
923+
924+
[<Tests>]
925+
let taskResultBindRequireNotNullTests =
926+
testList "TaskResult Bind + RequireNotNull Tests" [
927+
testCaseTask "bindRequireNotNull"
928+
<| fun _ ->
929+
task {
930+
do!
931+
"Test"
932+
|> TaskResult.ok
933+
|> TaskResult.bindRequireNotNull "Should not be null"
934+
|> Expect.hasTaskOkValue "Test"
935+
}
936+
]
937+
938+
[<Tests>]
939+
let taskResultBindRequireEqualTests =
940+
testList "TaskResult Bind + RequireEqual Tests" [
941+
testCaseTask "bindRequireEqual"
942+
<| fun _ ->
943+
task {
944+
do!
945+
2
946+
|> TaskResult.ok
947+
|> TaskResult.bindRequireEqual 2 "Should be equal"
948+
|> Expect.hasTaskOkValue ()
949+
}
950+
]
951+
952+
[<Tests>]
953+
let taskResultBindRequireEmptyTests =
954+
testList "TaskResult Bind + RequireEmpty Tests" [
955+
testCaseTask "bindRequireEmpty"
956+
<| fun _ ->
957+
task {
958+
do!
959+
[]
960+
|> TaskResult.ok
961+
|> TaskResult.bindRequireEmpty "Should be empty"
962+
|> Expect.hasTaskOkValue ()
963+
}
964+
]
965+
966+
[<Tests>]
967+
let taskResultBindRequireNotEmptyTests =
968+
testList "TaskResult Bind + RequireNotEmpty Tests" [
969+
testCaseTask "bindRequireNotEmpty"
970+
<| fun _ ->
971+
task {
972+
do!
973+
[ 1 ]
974+
|> TaskResult.ok
975+
|> TaskResult.bindRequireNotEmpty "Should not be empty"
976+
|> Expect.hasTaskOkValue ()
977+
}
978+
]
979+
980+
[<Tests>]
981+
let taskResultBindRequireHeadTests =
982+
testList "TaskResult Bind + RequireHead Tests" [
983+
testCaseTask "bindRequireHead"
984+
<| fun _ ->
985+
task {
986+
do!
987+
[ 1 ]
988+
|> TaskResult.ok
989+
|> TaskResult.bindRequireHead "Should not be empty"
990+
|> Expect.hasTaskOkValue 1
991+
}
992+
]

tests/FsToolkit.ErrorHandling.Tests/AsyncResult.fs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,87 @@ let asyncResultBindRequireValueOptionTests =
851851
}
852852
]
853853

854+
let asyncResultBindRequireTrueTests =
855+
testList "AsyncResult Bind + RequireTrue Tests" [
856+
testCaseAsync "bindRequireTrue"
857+
<| async {
858+
do!
859+
true
860+
|> AsyncResult.ok
861+
|> AsyncResult.bindRequireTrue "Should be true"
862+
|> Expect.hasAsyncOkValue ()
863+
}
864+
865+
testCaseAsync "bindRequireFalse"
866+
<| async {
867+
do!
868+
false
869+
|> AsyncResult.ok
870+
|> AsyncResult.bindRequireFalse "Should be false"
871+
|> Expect.hasAsyncOkValue ()
872+
}
873+
]
874+
875+
let asyncResultBindRequireNotNullTests =
876+
testList "AsyncResult Bind + RequireNotNull Tests" [
877+
testCaseAsync "bindRequireNotNull"
878+
<| async {
879+
do!
880+
"Test"
881+
|> AsyncResult.ok
882+
|> AsyncResult.bindRequireNotNull "Should not be null"
883+
|> Expect.hasAsyncOkValue "Test"
884+
}
885+
]
886+
887+
let asyncResultBindRequireEqualTests =
888+
testList "AsyncResult Bind + RequireEqual Tests" [
889+
testCaseAsync "bindRequireEqual"
890+
<| async {
891+
do!
892+
2
893+
|> AsyncResult.ok
894+
|> AsyncResult.bindRequireEqual 2 "Should be equal"
895+
|> Expect.hasAsyncOkValue ()
896+
}
897+
]
898+
899+
let asyncResultBindRequireEmptyTests =
900+
testList "AsyncResult Bind + RequireEmpty Tests" [
901+
testCaseAsync "bindRequireEmpty"
902+
<| async {
903+
do!
904+
[]
905+
|> AsyncResult.ok
906+
|> AsyncResult.bindRequireEmpty "Should be empty"
907+
|> Expect.hasAsyncOkValue ()
908+
}
909+
]
910+
911+
let asyncResultBindRequireNotEmptyTests =
912+
testList "AsyncResult Bind + RequireNotEmpty Tests" [
913+
testCaseAsync "bindRequireNotEmpty"
914+
<| async {
915+
do!
916+
[ 1 ]
917+
|> AsyncResult.ok
918+
|> AsyncResult.bindRequireNotEmpty "Should not be empty"
919+
|> Expect.hasAsyncOkValue ()
920+
}
921+
]
922+
923+
let asyncResultBindRequireHeadTests =
924+
testList "AsyncResult Bind + RequireHead Tests" [
925+
testCaseAsync "bindRequireHead"
926+
<| async {
927+
do!
928+
[ 1 ]
929+
|> AsyncResult.ok
930+
|> AsyncResult.bindRequireHead "Should not be empty"
931+
|> Expect.hasAsyncOkValue 1
932+
}
933+
]
934+
854935
let allTests =
855936
testList "Async Result tests" [
856937
mapTests
@@ -889,4 +970,10 @@ let allTests =
889970
zipErrorTests
890971
asyncResultBindRequireTests
891972
asyncResultBindRequireValueOptionTests
973+
asyncResultBindRequireTrueTests
974+
asyncResultBindRequireNotNullTests
975+
asyncResultBindRequireEqualTests
976+
asyncResultBindRequireEmptyTests
977+
asyncResultBindRequireNotEmptyTests
978+
asyncResultBindRequireHeadTests
892979
]

0 commit comments

Comments
 (0)