Skip to content

Commit db2b585

Browse files
committed
Elide the null-check in the returned task or taskSeq, instead, fail-fast
1 parent 7132200 commit db2b585

File tree

2 files changed

+465
-406
lines changed

2 files changed

+465
-406
lines changed

src/FSharp.Control.TaskSeq/TaskSeq.fs

Lines changed: 82 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,19 @@ module TaskSeq =
5151
e.DisposeAsync().AsTask().Wait()
5252
|]
5353

54-
let toSeq (source: taskSeq<'T>) = seq {
54+
let toSeq (source: taskSeq<'T>) =
5555
Internal.checkNonNull (nameof source) source
56-
let e = source.GetAsyncEnumerator(CancellationToken())
5756

58-
try
59-
while (let vt = e.MoveNextAsync() in if vt.IsCompleted then vt.Result else vt.AsTask().Result) do
60-
yield e.Current
61-
finally
62-
e.DisposeAsync().AsTask().Wait()
63-
}
57+
seq {
58+
59+
let e = source.GetAsyncEnumerator(CancellationToken())
60+
61+
try
62+
while (let vt = e.MoveNextAsync() in if vt.IsCompleted then vt.Result else vt.AsTask().Result) do
63+
yield e.Current
64+
finally
65+
e.DisposeAsync().AsTask().Wait()
66+
}
6467

6568
let toArrayAsync source =
6669
Internal.toResizeArrayAsync source
@@ -76,75 +79,82 @@ module TaskSeq =
7679
// Convert 'OfXXX' functions
7780
//
7881

79-
let ofArray (source: 'T[]) = taskSeq {
82+
let ofArray (source: 'T[]) =
8083
Internal.checkNonNull (nameof source) source
8184

82-
for c in source do
83-
yield c
84-
}
85+
taskSeq {
86+
for c in source do
87+
yield c
88+
}
8589

8690
let ofList (source: 'T list) = taskSeq {
8791
for c in source do
8892
yield c
8993
}
9094

91-
let ofSeq (source: 'T seq) = taskSeq {
95+
let ofSeq (source: 'T seq) =
9296
Internal.checkNonNull (nameof source) source
9397

94-
for c in source do
95-
yield c
96-
}
98+
taskSeq {
99+
for c in source do
100+
yield c
101+
}
97102

98-
let ofResizeArray (source: 'T ResizeArray) = taskSeq {
103+
let ofResizeArray (source: 'T ResizeArray) =
99104
Internal.checkNonNull (nameof source) source
100105

101-
for c in source do
102-
yield c
103-
}
106+
taskSeq {
107+
for c in source do
108+
yield c
109+
}
104110

105-
let ofTaskSeq (source: #Task<'T> seq) = taskSeq {
111+
let ofTaskSeq (source: #Task<'T> seq) =
106112
Internal.checkNonNull (nameof source) source
107113

108-
for c in source do
109-
let! c = c
110-
yield c
111-
}
114+
taskSeq {
115+
for c in source do
116+
let! c = c
117+
yield c
118+
}
112119

113120
let ofTaskList (source: #Task<'T> list) = taskSeq {
114121
for c in source do
115122
let! c = c
116123
yield c
117124
}
118125

119-
let ofTaskArray (source: #Task<'T> array) = taskSeq {
126+
let ofTaskArray (source: #Task<'T> array) =
120127
Internal.checkNonNull (nameof source) source
121128

122-
for c in source do
123-
let! c = c
124-
yield c
125-
}
129+
taskSeq {
130+
for c in source do
131+
let! c = c
132+
yield c
133+
}
126134

127-
let ofAsyncSeq (source: Async<'T> seq) = taskSeq {
135+
let ofAsyncSeq (source: Async<'T> seq) =
128136
Internal.checkNonNull (nameof source) source
129137

130-
for c in source do
131-
let! c = task { return! c }
132-
yield c
133-
}
138+
taskSeq {
139+
for c in source do
140+
let! c = task { return! c }
141+
yield c
142+
}
134143

135144
let ofAsyncList (source: Async<'T> list) = taskSeq {
136145
for c in source do
137146
let! c = Task.ofAsync c
138147
yield c
139148
}
140149

141-
let ofAsyncArray (source: Async<'T> array) = taskSeq {
150+
let ofAsyncArray (source: Async<'T> array) =
142151
Internal.checkNonNull (nameof source) source
143152

144-
for c in source do
145-
let! c = Async.toTask c
146-
yield c
147-
}
153+
taskSeq {
154+
for c in source do
155+
let! c = Async.toTask c
156+
yield c
157+
}
148158

149159
//
150160
// Utility functions
@@ -164,34 +174,41 @@ module TaskSeq =
164174
member _.GetAsyncEnumerator(ct) = generator().GetAsyncEnumerator(ct)
165175
}
166176

167-
let concat (sources: taskSeq<#taskSeq<'T>>) = taskSeq {
177+
let concat (sources: taskSeq<#taskSeq<'T>>) =
168178
Internal.checkNonNull (nameof sources) sources
169179

170-
for ts in sources do
171-
// no null-check of inner taskseqs, similar to seq
172-
yield! (ts :> taskSeq<'T>)
173-
}
180+
taskSeq {
181+
for ts in sources do
182+
// no null-check of inner taskseqs, similar to seq
183+
yield! (ts :> taskSeq<'T>)
184+
}
174185

175-
let append (source1: taskSeq<'T>) (source2: taskSeq<'T>) = taskSeq {
186+
let append (source1: taskSeq<'T>) (source2: taskSeq<'T>) =
176187
Internal.checkNonNull (nameof source1) source1
177188
Internal.checkNonNull (nameof source2) source2
178-
yield! source1
179-
yield! source2
180-
}
181189

182-
let appendSeq (source1: taskSeq<'T>) (source2: seq<'T>) = taskSeq {
190+
taskSeq {
191+
yield! source1
192+
yield! source2
193+
}
194+
195+
let appendSeq (source1: taskSeq<'T>) (source2: seq<'T>) =
183196
Internal.checkNonNull (nameof source1) source1
184197
Internal.checkNonNull (nameof source2) source2
185-
yield! source1
186-
yield! source2
187-
}
188198

189-
let prependSeq (source1: seq<'T>) (source2: taskSeq<'T>) = taskSeq {
199+
taskSeq {
200+
yield! source1
201+
yield! source2
202+
}
203+
204+
let prependSeq (source1: seq<'T>) (source2: taskSeq<'T>) =
190205
Internal.checkNonNull (nameof source1) source1
191206
Internal.checkNonNull (nameof source2) source2
192-
yield! source1
193-
yield! source2
194-
}
207+
208+
taskSeq {
209+
yield! source1
210+
yield! source2
211+
}
195212

196213
//
197214
// iter/map/collect functions
@@ -261,14 +278,16 @@ module TaskSeq =
261278
| None -> return invalidArg (nameof source) "The input sequence contains more than one element."
262279
}
263280

264-
let indexed (source: taskSeq<'T>) = taskSeq {
281+
let indexed (source: taskSeq<'T>) =
265282
Internal.checkNonNull (nameof source) source
266-
let mutable i = 0
267283

268-
for x in source do
269-
yield i, x
270-
i <- i + 1
271-
}
284+
taskSeq {
285+
let mutable i = 0
286+
287+
for x in source do
288+
yield i, x
289+
i <- i + 1
290+
}
272291

273292
let choose chooser source = Internal.choose (TryPick chooser) source
274293
let chooseAsync chooser source = Internal.choose (TryPickAsync chooser) source

0 commit comments

Comments
 (0)