Skip to content

Commit e1f5161

Browse files
committed
Add support for CancellationToken to TaskSeq
1 parent e2d79cf commit e1f5161

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

src/FSharp.Control.TaskSeq/TaskSeqBuilder.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,12 @@ module HighPriority =
672672
sm.Data.current <- ValueNone
673673
false)
674674

675+
// Binding to a cancellation token. This allows `do! someCancellationToken`
676+
member inline _.Bind(myToken: CancellationToken, continuation: (unit -> ResumableTSC<'T>)) : ResumableTSC<'T> =
677+
ResumableTSC<'T>(fun sm ->
678+
sm.Data.cancellationToken <- myToken
679+
(continuation ()).Invoke(&sm))
680+
675681
[<AutoOpen>]
676682
module TaskSeqBuilder =
677683
/// Builds an asynchronous task sequence based on IAsyncEnumerable<'T> using computation expression syntax.

src/FSharp.Control.TaskSeq/TaskSeqInternal.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ module internal TaskSeqInternal =
6767
KeyNotFoundException("The predicate function or index did not satisfy any item in the async sequence.")
6868
|> raise
6969

70+
let inline withCancellationToken (cancellationToken: CancellationToken) (source: taskSeq<'T>) = taskSeq {
71+
do! cancellationToken
72+
yield! source
73+
}
74+
7075
let isEmpty (source: taskSeq<_>) =
7176
checkNonNull (nameof source) source
7277

0 commit comments

Comments
 (0)