Skip to content

Commit 43b69ca

Browse files
committed
Add TaskSeq.tail and tryTail functions (todo: tests)
1 parent e128340 commit 43b69ca

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

src/FSharp.Control.TaskSeq/TaskSeq.fs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,13 @@ module TaskSeq =
215215
| None -> return Internal.raiseEmptySeq ()
216216
}
217217

218+
let tryTail source = Internal.tryTail source
219+
220+
let tail source = task {
221+
match! Internal.tryTail source with
222+
| Some result -> return result
223+
| None -> return Internal.raiseEmptySeq ()
224+
}
218225
let tryItem index source = Internal.tryItem index source
219226

220227
let item index source = task {

src/FSharp.Control.TaskSeq/TaskSeq.fsi

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,21 +232,30 @@ module TaskSeq =
232232
val collectSeqAsync: binder: ('T -> #Task<'SeqU>) -> source: taskSeq<'T> -> taskSeq<'U> when 'SeqU :> seq<'U>
233233

234234
/// <summary>
235-
/// Returns the first element of the <see cref="taskSeq" />, or <see cref="None" /> if the sequence is empty.
235+
/// Returns the first element of the task sequence from <paramref name="source" />, or <see cref="None" /> if the sequence is empty.
236236
/// </summary>
237-
/// <exception cref="ArgumentException">Thrown when the sequence is empty.</exception>
238237
val tryHead: source: taskSeq<'T> -> Task<'T option>
239238

240239
/// <summary>
241-
/// Returns the first element of the <see cref="taskSeq" />.
240+
/// Returns the first elementof the task sequence from <paramref name="source" />
242241
/// </summary>
243242
/// <exception cref="ArgumentException">Thrown when the sequence is empty.</exception>
244243
val head: source: taskSeq<'T> -> Task<'T>
245244

246245
/// <summary>
247-
/// Returns the last element of the <see cref="taskSeq" />, or <see cref="None" /> if the sequence is empty.
246+
/// Returns the whole task sequence from <paramref name="source" />, minus its first element, or <see cref="None" /> if the sequence is empty.
247+
/// </summary>
248+
val tryTail: source: taskSeq<'T> -> Task<taskSeq<'T> option>
249+
250+
/// <summary>
251+
/// Returns the whole task sequence from <paramref name="source" />, minus its first element.
248252
/// </summary>
249253
/// <exception cref="ArgumentException">Thrown when the sequence is empty.</exception>
254+
val tail: source: taskSeq<'T> -> Task<taskSeq<'T>>
255+
256+
/// <summary>
257+
/// Returns the last element of the task sequence from <paramref name="source" />, or <see cref="None" /> if the sequence is empty.
258+
/// </summary>
250259
val tryLast: source: taskSeq<'T> -> Task<'T option>
251260

252261
/// <summary>

src/FSharp.Control.TaskSeq/TaskSeqInternal.fs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,30 @@ module internal TaskSeqInternal =
338338

339339
let tryHead (source: taskSeq<_>) = task {
340340
use e = source.GetAsyncEnumerator(CancellationToken())
341-
let mutable go = true
342-
let! step = e.MoveNextAsync()
343-
go <- step
344341

345-
if go then return Some e.Current else return None
342+
match! e.MoveNextAsync() with
343+
| true -> return Some e.Current
344+
| false -> return None
345+
}
346+
347+
let tryTail (source: taskSeq<_>) = task {
348+
use e = source.GetAsyncEnumerator(CancellationToken())
349+
350+
match! e.MoveNextAsync() with
351+
| false -> return None
352+
| true ->
353+
return
354+
taskSeq {
355+
let mutable go = true
356+
let! step = e.MoveNextAsync()
357+
go <- step
358+
359+
while go do
360+
yield e.Current
361+
let! step = e.MoveNextAsync()
362+
go <- step
363+
}
364+
|> Some
346365
}
347366

348367
let tryItem index (source: taskSeq<_>) = task {

0 commit comments

Comments
 (0)