Skip to content

Commit ff1f64f

Browse files
Add valueTaskValueOption CE for ValueTask<'T voption> computation expressions (#348)
* Initial plan * Add valueTaskValueOption CE (ValueTask<'T voption> computation expression) Co-authored-by: TheAngryByrd <1490044+TheAngryByrd@users.noreply.github.com> * Fix duplicate System import in ValueTaskValueOptionCE.fs Co-authored-by: TheAngryByrd <1490044+TheAngryByrd@users.noreply.github.com> * Add gitbook documentation for valueTaskValueOption Co-authored-by: TheAngryByrd <1490044+TheAngryByrd@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: TheAngryByrd <1490044+TheAngryByrd@users.noreply.github.com>
1 parent 9cd957e commit ff1f64f

15 files changed

Lines changed: 1592 additions & 0 deletions

File tree

gitbook/SUMMARY.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@
176176
* [Other Functions](taskValueOption/others.md)
177177
* [zip](taskValueOption/zip.md)
178178

179+
* ValueTaskValueOption
180+
* [apply](valueTaskValueOption/apply.md)
181+
* [bind](valueTaskValueOption/bind.md)
182+
* [Computation Expression](valueTaskValueOption/ce.md)
183+
* [either](valueTaskValueOption/either.md)
184+
* [map](valueTaskValueOption/map.md)
185+
* [Other Functions](valueTaskValueOption/others.md)
186+
* [zip](valueTaskValueOption/zip.md)
187+
179188
* TaskResult
180189
* [apply](taskResult/apply.md)
181190
* [bind](taskResult/bind.md)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# ValueTaskValueOption.apply
2+
3+
Namespace: `FsToolkit.ErrorHandling`
4+
5+
Function Signature:
6+
7+
```fsharp
8+
ValueTask<('a -> 'b) voption> -> ValueTask<'a voption> -> ValueTask<'b voption>
9+
```
10+
11+
## Examples
12+
13+
Take the following function for example
14+
15+
```fsharp
16+
// string -> int
17+
let characterCount (s: string) = s.Length
18+
```
19+
20+
### Example 1
21+
22+
```fsharp
23+
let result =
24+
ValueTaskValueOption.valueSome "foo" // ValueTask<string voption>
25+
|> ValueTaskValueOption.apply (ValueTaskValueOption.valueSome characterCount) // ValueTask<int voption>
26+
27+
// valueTask { ValueSome 3 }
28+
```
29+
30+
### Example 2
31+
32+
```fsharp
33+
let result =
34+
ValueTask<_>(ValueNone) // ValueTask<string voption>
35+
|> ValueTaskValueOption.apply (ValueTaskValueOption.valueSome characterCount) // ValueTask<int voption>
36+
37+
// valueTask { ValueNone }
38+
```
39+
40+
### Example 3
41+
42+
```fsharp
43+
let result : ValueTask<int voption> =
44+
ValueTaskValueOption.valueSome "foo" // ValueTask<string voption>
45+
|> ValueTaskValueOption.apply (ValueTask<_>(ValueNone)) // ValueTask<int voption>
46+
47+
// valueTask { ValueNone }
48+
```
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# ValueTaskValueOption.bind
2+
3+
Namespace: `FsToolkit.ErrorHandling`
4+
5+
## Function Signature
6+
7+
```fsharp
8+
('input -> ValueTask<'output voption>) -> ValueTask<'input voption> -> ValueTask<'output voption>
9+
```
10+
11+
## Examples
12+
13+
Take the following function for example
14+
15+
```fsharp
16+
type Account =
17+
{ EmailAddress : string
18+
Name : string }
19+
20+
// string -> ValueTask<Account voption>
21+
let lookupAccountByEmail email = valueTask {
22+
let john = { EmailAddress = "john@test.com"; Name = "John Johnson" }
23+
let jeff = { EmailAddress = "jeff@test.com"; Name = "Jeff Jefferson" }
24+
let jack = { EmailAddress = "jack@test.com"; Name = "Jack Jackson" }
25+
26+
// Just a map lookup, but imagine we look up an account in our database
27+
let accounts = Map.ofList [
28+
("john@test.com", john)
29+
("jeff@test.com", jeff)
30+
("jack@test.com", jack)
31+
]
32+
33+
return
34+
accounts
35+
|> Map.tryFind email
36+
|> Option.toValueOption
37+
}
38+
```
39+
40+
### Example 1
41+
42+
```fsharp
43+
let result : ValueTask<Account voption> =
44+
ValueTaskValueOption.valueSome "john@test.com" // ValueTask<string voption>
45+
|> ValueTaskValueOption.bind lookupAccountByEmail // ValueTask<Account voption>
46+
47+
// valueTask { ValueSome { EmailAddress = "john@test.com"; Name = "John Johnson" } }
48+
```
49+
50+
### Example 2
51+
52+
```fsharp
53+
let result : ValueTask<Account voption> =
54+
ValueTaskValueOption.valueSome "jerry@test.com" // ValueTask<string voption>
55+
|> ValueTaskValueOption.bind lookupAccountByEmail // ValueTask<Account voption>
56+
57+
// valueTask { ValueNone }
58+
```
59+
60+
### Example 3
61+
62+
```fsharp
63+
let result : ValueTask<Account voption> =
64+
ValueTask<_>(ValueNone) // ValueTask<string voption>
65+
|> ValueTaskValueOption.bind lookupAccountByEmail // ValueTask<Account voption>
66+
67+
// valueTask { ValueNone }
68+
```

gitbook/valueTaskValueOption/ce.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
## ValueTaskValueOption Computation Expression
2+
3+
Namespace: `FsToolkit.ErrorHandling`
4+
5+
## Examples:
6+
7+
### Example 1
8+
9+
Given a personId and an age, find a person and update their age.
10+
11+
```fsharp
12+
tryParseInt : string -> int voption
13+
tryFindPersonById : int -> ValueTask<Person voption>
14+
updatePerson : Person -> ValueTask<unit>
15+
```
16+
17+
```fsharp
18+
// ValueTask<unit voption>
19+
let addResult = valueTaskValueOption {
20+
let! personId = tryParseInt "3001"
21+
let! age = tryParseInt "35"
22+
let! person = tryFindPersonById personId
23+
let person = { person with Age = age }
24+
do! updatePerson person
25+
}
26+
```
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# ValueTaskValueOption.either
2+
3+
Namespace: `FsToolkit.ErrorHandling`
4+
5+
## Function Signature
6+
7+
Provide two functions to execute depending on the value of the voption. If the voption is `ValueSome`, the first function will be executed. If the voption is `ValueNone`, the second function will be executed.
8+
9+
```fsharp
10+
(onValueSome : 'T -> ValueTask<'output>)
11+
-> (onValueNone : unit -> ValueTask<'output>)
12+
-> (input : ValueTask<'T voption>)
13+
-> ValueTask<'output>
14+
```
15+
16+
## Examples
17+
18+
### Example 1
19+
20+
```fsharp
21+
ValueTaskValueOption.either (fun x -> valueTask { return x * 2 }) (fun () -> valueTask { return 0 }) (ValueTaskValueOption.valueSome 5)
22+
23+
// valueTask { 10 }
24+
```
25+
26+
### Example 2
27+
28+
```fsharp
29+
ValueTaskValueOption.either (fun x -> valueTask { return x * 2 }) (fun () -> valueTask { return 0 }) (ValueTask<_>(ValueNone))
30+
31+
// valueTask { 0 }
32+
```
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# ValueTaskValueOption.map
2+
3+
Namespace: `FsToolkit.ErrorHandling`
4+
5+
Apply a function to the value of a value task voption if it is `ValueSome`. If the voption is `ValueNone`, return `ValueNone`.
6+
7+
## Function Signature
8+
9+
```fsharp
10+
('input -> 'output) -> ValueTask<'input voption> -> ValueTask<'output voption>
11+
```
12+
13+
## Examples
14+
15+
### Example 1
16+
17+
```fsharp
18+
ValueTaskValueOption.map (fun x -> x + 1) (ValueTaskValueOption.valueSome 1)
19+
20+
// valueTask { ValueSome 2 }
21+
```
22+
23+
### Example 2
24+
25+
```fsharp
26+
ValueTaskValueOption.map (fun x -> x + 1) (ValueTask<_>(ValueNone))
27+
28+
// valueTask { ValueNone }
29+
```
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Other ValueTaskValueOption Functions
2+
3+
## defaultValue
4+
5+
Returns the contained value if ValueSome, otherwise returns the provided value
6+
7+
### Function Signature
8+
9+
```fsharp
10+
'a -> ValueTask<'a voption> -> ValueTask<'a>
11+
```
12+
13+
## defaultWith
14+
15+
Returns the contained value if ValueSome, otherwise evaluates the given function and returns the result.
16+
17+
### Function Signature
18+
19+
```fsharp
20+
(unit -> 'a) -> ValueTask<'a voption> -> ValueTask<'a>
21+
```
22+
23+
## valueSome
24+
25+
Wraps the provided value in a `ValueTask<'a voption>`
26+
27+
### Function Signature
28+
29+
```fsharp
30+
'a -> ValueTask<'a voption>
31+
```
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# ValueTaskValueOption.zip
2+
3+
Namespace: `FsToolkit.ErrorHandling`
4+
5+
Takes two voptions and returns a tuple of the pair or ValueNone if either are ValueNone
6+
7+
## Function Signature
8+
9+
```fsharp
10+
ValueTask<'left voption> -> ValueTask<'right voption> -> ValueTask<('left * 'right) voption>
11+
```
12+
13+
## Examples
14+
15+
### Example 1
16+
17+
```fsharp
18+
let left = ValueTaskValueOption.valueSome 123
19+
let right = ValueTaskValueOption.valueSome "abc"
20+
21+
ValueTaskValueOption.zip left right
22+
// valueTask { ValueSome (123, "abc") }
23+
```
24+
25+
### Example 2
26+
27+
```fsharp
28+
let left = ValueTaskValueOption.valueSome 123
29+
let right = ValueTask<_>(ValueNone)
30+
31+
ValueTaskValueOption.zip left right
32+
// valueTask { ValueNone }
33+
```

src/FsToolkit.ErrorHandling/FsToolkit.ErrorHandling.fsproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,13 @@
4141
<Compile Include="AsyncOptionOp.fs" />
4242
<Compile Include="TaskOption.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
4343
<Compile Include="TaskValueOption.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
44+
<Compile Include="ValueTaskValueOption.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
4445
<Compile Include="TaskOptionCE.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
4546
<Compile Include="TaskValueOptionCE.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
47+
<Compile Include="ValueTaskValueOptionCE.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
4648
<Compile Include="TaskOptionOp.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
4749
<Compile Include="TaskValueOptionOp.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
50+
<Compile Include="ValueTaskValueOptionOp.fs" Condition="'$(FABLE_COMPILER)' != 'true'" />
4851
<Compile Include="AsyncResultOption.fs" />
4952
<Compile Include="AsyncResultOptionCE.fs" />
5053
<Compile Include="AsyncResultOptionOp.fs" />

0 commit comments

Comments
 (0)