Skip to content

Commit 1e643eb

Browse files
committed
Add let-bang tests for corner cases
1 parent c1b2c41 commit 1e643eb

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
module TaskSeq.Tests.Let
2+
3+
open System
4+
open System.Threading.Tasks
5+
open FsUnit
6+
open Xunit
7+
8+
open FSharp.Control
9+
10+
[<Fact>]
11+
let ``CE taskSeq: use 'let'`` () =
12+
let mutable value = 0
13+
14+
taskSeq {
15+
let value1 = value + 1
16+
let value2 = value1 + 1
17+
yield value2
18+
}
19+
|> TaskSeq.exactlyOne
20+
|> Task.map (should equal 2)
21+
22+
[<Fact>]
23+
let ``CE taskSeq: use 'let!' with a task<unit>`` () =
24+
let mutable value = 0
25+
26+
taskSeq {
27+
let! unit' = task { do value <- value + 1 }
28+
do unit'
29+
}
30+
|> verifyEmpty
31+
|> Task.map (fun _ -> value |> should equal 1)
32+
33+
[<Fact>]
34+
let ``CE taskSeq: use 'let!' with a task<string>`` () =
35+
taskSeq {
36+
let! test = task { return "test" }
37+
yield test
38+
}
39+
|> TaskSeq.exactlyOne
40+
|> Task.map (should equal "test")
41+
42+
[<Fact>]
43+
let ``CE taskSeq: use 'let!' with a valuetask<unit>`` () =
44+
let mutable value = 0
45+
46+
taskSeq {
47+
let! unit' = ValueTask.ofTask (task { do value <- value + 1 })
48+
do unit'
49+
}
50+
|> verifyEmpty
51+
|> Task.map (fun _ -> value |> should equal 1)
52+
53+
[<Fact>]
54+
let ``CE taskSeq: use 'let!' with a valuetask<string>`` () =
55+
taskSeq {
56+
let! test = ValueTask.ofTask (task { return "test" })
57+
yield test
58+
}
59+
|> TaskSeq.exactlyOne
60+
|> Task.map (should equal "test")
61+
62+
[<Fact>]
63+
let ``CE taskSeq: use 'let!' with a non-generic valuetask`` () =
64+
let mutable value = 0
65+
66+
taskSeq {
67+
let! unit' = ValueTask(task { do value <- value + 1 })
68+
do unit'
69+
}
70+
|> verifyEmpty
71+
|> Task.map (fun _ -> value |> should equal 1)
72+
73+
[<Fact>]
74+
let ``CE taskSeq: use 'let!' with a non-generic task`` () =
75+
let mutable value = 0
76+
77+
taskSeq {
78+
let! unit' = (task { do value <- value + 1 }) |> Task.ignore
79+
do unit'
80+
}
81+
|> verifyEmpty
82+
|> Task.map (fun _ -> value |> should equal 1)

src/FSharp.Control.TaskSeq/TaskSeqBuilder.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ module HighPriority =
635635
//
636636
member inline _.Bind(task: Task<'TResult1>, continuation: ('TResult1 -> TaskSeqCode<'T>)) : TaskSeqCode<'T> =
637637
TaskSeqCode<'T>(fun sm ->
638-
let mutable awaiter: TaskAwaiter<'TResult1> = task.GetAwaiter()
638+
let mutable awaiter = task.GetAwaiter()
639639
let mutable __stack_fin = true
640640

641641
Debug.logInfo "at Bind"

0 commit comments

Comments
 (0)