File tree Expand file tree Collapse file tree 3 files changed +43
-8
lines changed
src/FSharp.Control.TaskSeq Expand file tree Collapse file tree 3 files changed +43
-8
lines changed Original file line number Diff line number Diff 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 {
Original file line number Diff line number Diff 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>
Original file line number Diff line number Diff 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 {
You can’t perform that action at this time.
0 commit comments