From 007d51fa96f23d24bee76c46a31e9b23392bee86 Mon Sep 17 00:00:00 2001 From: Abel Braaksma Date: Sun, 5 Nov 2023 16:19:01 +0100 Subject: [PATCH 1/4] Deprecate utils `ValueTask.ofIValueTaskSource` in favor of `ValueTask.ofSource` temp --- src/FSharp.Control.TaskSeq/TaskSeq.fs | 6 +++--- src/FSharp.Control.TaskSeq/Utils.fs | 4 ++-- src/FSharp.Control.TaskSeq/Utils.fsi | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/FSharp.Control.TaskSeq/TaskSeq.fs b/src/FSharp.Control.TaskSeq/TaskSeq.fs index 68119755..fb8d67b8 100644 --- a/src/FSharp.Control.TaskSeq/TaskSeq.fs +++ b/src/FSharp.Control.TaskSeq/TaskSeq.fs @@ -40,7 +40,7 @@ type TaskSeq private () = static member toList(source: TaskSeq<'T>) = [ Internal.checkNonNull (nameof source) source - let e = source.GetAsyncEnumerator(CancellationToken()) + let e = source.GetAsyncEnumerator CancellationToken.None try while (let vt = e.MoveNextAsync() in if vt.IsCompleted then vt.Result else vt.AsTask().Result) do @@ -51,7 +51,7 @@ type TaskSeq private () = static member toArray(source: TaskSeq<'T>) = [| Internal.checkNonNull (nameof source) source - let e = source.GetAsyncEnumerator(CancellationToken()) + let e = source.GetAsyncEnumerator CancellationToken.None try while (let vt = e.MoveNextAsync() in if vt.IsCompleted then vt.Result else vt.AsTask().Result) do @@ -65,7 +65,7 @@ type TaskSeq private () = seq { - let e = source.GetAsyncEnumerator(CancellationToken()) + let e = source.GetAsyncEnumerator CancellationToken.None try while (let vt = e.MoveNextAsync() in if vt.IsCompleted then vt.Result else vt.AsTask().Result) do diff --git a/src/FSharp.Control.TaskSeq/Utils.fs b/src/FSharp.Control.TaskSeq/Utils.fs index 986880ec..1f11984a 100644 --- a/src/FSharp.Control.TaskSeq/Utils.fs +++ b/src/FSharp.Control.TaskSeq/Utils.fs @@ -25,10 +25,10 @@ module ValueTask = let True = ValueTask true /// Creates a ValueTask with the supplied result of the successful operation. - let inline fromResult (x: 'T) = ValueTask<'T> x + let inline fromResult (value: 'T) = ValueTask<'T> value [] - let inline FromResult (x: 'T) = ValueTask<'T> x + let inline FromResult (value: 'T) = ValueTask<'T> value /// Creates a ValueTask with an IValueTaskSource representing the operation let inline ofSource taskSource version = ValueTask(taskSource, version) diff --git a/src/FSharp.Control.TaskSeq/Utils.fsi b/src/FSharp.Control.TaskSeq/Utils.fsi index 4aee1bca..d34a1e57 100644 --- a/src/FSharp.Control.TaskSeq/Utils.fsi +++ b/src/FSharp.Control.TaskSeq/Utils.fsi @@ -20,14 +20,14 @@ module ValueTask = val True: ValueTask /// Creates a ValueTask with the supplied result of the successful operation. - val inline fromResult: x: 'T -> ValueTask<'T> + val inline fromResult: value: 'T -> ValueTask<'T> /// /// The function is deprecated since version 0.4.0, /// please use in its stead. See . /// [] - val inline FromResult: x: 'T -> ValueTask<'T> + val inline FromResult: value: 'T -> ValueTask<'T> /// /// Initialized a new instance of with an representing From da147cb1f38e7a4055bc91f09bc25e5b0762e041 Mon Sep 17 00:00:00 2001 From: Abel Braaksma Date: Sun, 5 Nov 2023 16:54:34 +0100 Subject: [PATCH 2/4] Remove doc comments from implementation file, we have the sign file already --- src/FSharp.Control.TaskSeq/Utils.fs | 32 ----------------------------- 1 file changed, 32 deletions(-) diff --git a/src/FSharp.Control.TaskSeq/Utils.fs b/src/FSharp.Control.TaskSeq/Utils.fs index 1f11984a..4a30c7d0 100644 --- a/src/FSharp.Control.TaskSeq/Utils.fs +++ b/src/FSharp.Control.TaskSeq/Utils.fs @@ -18,28 +18,22 @@ module ValueTaskExtensions = module ValueTask = - /// A successfully completed ValueTask of boolean that has the value false. let False = ValueTask() - /// A successfully completed ValueTask of boolean that has the value true. let True = ValueTask true - /// Creates a ValueTask with the supplied result of the successful operation. let inline fromResult (value: 'T) = ValueTask<'T> value [] let inline FromResult (value: 'T) = ValueTask<'T> value - /// Creates a ValueTask with an IValueTaskSource representing the operation let inline ofSource taskSource version = ValueTask(taskSource, version) [] let inline ofIValueTaskSource taskSource version = ofSource taskSource version - /// Creates a ValueTask form a Task<'T> let inline ofTask (task: Task<'T>) = ValueTask<'T> task - /// Ignore a ValueTask<'T>, returns a non-generic ValueTask. let inline ignore (vtask: ValueTask<'T>) = // this implementation follows Stephen Toub's advice, see: // https://github.com/dotnet/runtime/issues/31503#issuecomment-554415966 @@ -51,28 +45,13 @@ module ValueTask = ValueTask(vtask.AsTask()) module Task = - /// Convert an Async<'T> into a Task<'T> let inline ofAsync (async: Async<'T>) = task { return! async } - - /// Convert a unit-task into a Task let inline ofTask (task': Task) = task { do! task' } - - /// Convert a non-task function into a task-returning function let inline apply (func: _ -> _) = func >> Task.FromResult - - /// Convert a Task<'T> into an Async<'T> let inline toAsync (task: Task<'T>) = Async.AwaitTask task - - /// Convert a Task<'T> into a ValueTask<'T> let inline toValueTask (task: Task<'T>) = ValueTask<'T> task - - /// - /// Convert a ValueTask<'T> to a Task<'T>. To use a non-generic ValueTask, - /// consider using: . - /// let inline ofValueTask (valueTask: ValueTask<'T>) = task { return! valueTask } - /// Convert a Task<'T> into a non-generic Task, ignoring the result let inline ignore (task: Task<'T>) = TaskBuilder.task { // ensure the task is awaited @@ -81,42 +60,31 @@ module Task = } :> Task - /// Map a Task<'T> let inline map mapper (task: Task<'T>) : Task<'U> = TaskBuilder.task { let! result = task return mapper result } - /// Bind a Task<'T> let inline bind binder (task: Task<'T>) : Task<'U> = TaskBuilder.task { let! t = task return! binder t } - /// Create a task from a value let inline fromResult (value: 'U) : Task<'U> = Task.FromResult value module Async = - /// Convert an Task<'T> into an Async<'T> let inline ofTask (task: Task<'T>) = Async.AwaitTask task - - /// Convert a unit-task into an Async let inline ofUnitTask (task: Task) = Async.AwaitTask task - - /// Convert a Task<'T> into an Async<'T> let inline toTask (async: Async<'T>) = task { return! async } - /// Convert an Async<'T> into an Async, ignoring the result let inline ignore (async': Async<'T>) = async { let! _ = async' return () } - /// Map an Async<'T> let inline map mapper (async: Async<'T>) : Async<'U> = ExtraTopLevelOperators.async { let! result = async return mapper result } - /// Bind an Async<'T> let inline bind binder (task: Async<'T>) : Async<'U> = ExtraTopLevelOperators.async { return! binder task } From e9985c41d207ea0409990e451a709a5f716def43 Mon Sep 17 00:00:00 2001 From: Abel Braaksma Date: Sun, 5 Nov 2023 17:06:32 +0100 Subject: [PATCH 3/4] Some function reordering --- src/FSharp.Control.TaskSeq/Utils.fs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/FSharp.Control.TaskSeq/Utils.fs b/src/FSharp.Control.TaskSeq/Utils.fs index 4a30c7d0..c02bab35 100644 --- a/src/FSharp.Control.TaskSeq/Utils.fs +++ b/src/FSharp.Control.TaskSeq/Utils.fs @@ -19,19 +19,9 @@ module ValueTaskExtensions = module ValueTask = let False = ValueTask() - let True = ValueTask true - let inline fromResult (value: 'T) = ValueTask<'T> value - - [] - let inline FromResult (value: 'T) = ValueTask<'T> value - let inline ofSource taskSource version = ValueTask(taskSource, version) - - [] - let inline ofIValueTaskSource taskSource version = ofSource taskSource version - let inline ofTask (task: Task<'T>) = ValueTask<'T> task let inline ignore (vtask: ValueTask<'T>) = @@ -44,7 +34,15 @@ module ValueTask = else ValueTask(vtask.AsTask()) + [] + let inline FromResult (value: 'T) = ValueTask<'T> value + + [] + let inline ofIValueTaskSource taskSource version = ofSource taskSource version + + module Task = + let inline fromResult (value: 'U) : Task<'U> = Task.FromResult value let inline ofAsync (async: Async<'T>) = task { return! async } let inline ofTask (task': Task) = task { do! task' } let inline apply (func: _ -> _) = func >> Task.FromResult @@ -70,12 +68,11 @@ module Task = return! binder t } - let inline fromResult (value: 'U) : Task<'U> = Task.FromResult value - module Async = let inline ofTask (task: Task<'T>) = Async.AwaitTask task let inline ofUnitTask (task: Task) = Async.AwaitTask task let inline toTask (async: Async<'T>) = task { return! async } + let inline bind binder (task: Async<'T>) : Async<'U> = ExtraTopLevelOperators.async { return! binder task } let inline ignore (async': Async<'T>) = async { let! _ = async' @@ -86,5 +83,3 @@ module Async = let! result = async return mapper result } - - let inline bind binder (task: Async<'T>) : Async<'U> = ExtraTopLevelOperators.async { return! binder task } From 0326402616c6919868c4f343c4df76cd91fc3acd Mon Sep 17 00:00:00 2001 From: Abel Braaksma Date: Sun, 5 Nov 2023 17:16:01 +0100 Subject: [PATCH 4/4] Use `CancellationToken.None` as opposed to the constructor --- src/FSharp.Control.TaskSeq/TaskExtensions.fs | 2 +- src/FSharp.Control.TaskSeq/TaskSeqInternal.fs | 40 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/FSharp.Control.TaskSeq/TaskExtensions.fs b/src/FSharp.Control.TaskSeq/TaskExtensions.fs index f43211aa..267347c3 100644 --- a/src/FSharp.Control.TaskSeq/TaskExtensions.fs +++ b/src/FSharp.Control.TaskSeq/TaskExtensions.fs @@ -60,7 +60,7 @@ module TaskExtensions = TaskCode<'TOverall, unit>(fun sm -> this .Using( - source.GetAsyncEnumerator(CancellationToken()), + source.GetAsyncEnumerator CancellationToken.None, (fun e -> this.WhileAsync( // __debugPoint is only available from FSharp.Core 6.0.4 diff --git a/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs b/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs index 9594caf9..7ea572a5 100644 --- a/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs +++ b/src/FSharp.Control.TaskSeq/TaskSeqInternal.fs @@ -71,7 +71,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let! step = e.MoveNextAsync() return not step } @@ -107,7 +107,7 @@ module internal TaskSeqInternal = task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable i = 0 let! step = e.MoveNextAsync() @@ -146,7 +146,7 @@ module internal TaskSeqInternal = task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable i = 0 let! step = e.MoveNextAsync() @@ -164,7 +164,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None match! e.MoveNextAsync() with | true -> @@ -223,7 +223,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let! step = e.MoveNextAsync() go <- step @@ -267,7 +267,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable result = initial let! step = e.MoveNextAsync() @@ -338,8 +338,8 @@ module internal TaskSeqInternal = checkNonNull (nameof source2) source2 taskSeq { - use e1 = source1.GetAsyncEnumerator(CancellationToken()) - use e2 = source2.GetAsyncEnumerator(CancellationToken()) + use e1 = source1.GetAsyncEnumerator CancellationToken.None + use e2 = source2.GetAsyncEnumerator CancellationToken.None let mutable go = true let! step1 = e1.MoveNextAsync() let! step2 = e2.MoveNextAsync() @@ -390,7 +390,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable last = ValueNone let! step = e.MoveNextAsync() @@ -410,7 +410,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None match! e.MoveNextAsync() with | true -> return Some e.Current @@ -421,7 +421,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None match! e.MoveNextAsync() with | false -> return None @@ -449,7 +449,7 @@ module internal TaskSeqInternal = // to prevent side effects hitting unnecessarily return None else - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable idx = 0 let mutable foundItem = None @@ -472,7 +472,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable foundItem = None @@ -507,7 +507,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable foundItem = None @@ -546,7 +546,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source task { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let mutable isFound = false @@ -617,7 +617,7 @@ module internal TaskSeqInternal = checkNonNull (nameof source) source taskSeq { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let! step = e.MoveNextAsync() let mutable more = step @@ -725,14 +725,14 @@ module internal TaskSeqInternal = checkNonNull (nameof itemsToExclude) itemsToExclude taskSeq { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let! step = e.MoveNextAsync() go <- step if step then // only create hashset by the time we actually start iterating - use hashSet = new ConcurrentHashSet<_>(CancellationToken()) + use hashSet = new ConcurrentHashSet<_>(CancellationToken.None) do! hashSet.AddManyAsync itemsToExclude while go do @@ -753,14 +753,14 @@ module internal TaskSeqInternal = checkNonNull (nameof itemsToExclude) itemsToExclude taskSeq { - use e = source.GetAsyncEnumerator(CancellationToken()) + use e = source.GetAsyncEnumerator CancellationToken.None let mutable go = true let! step = e.MoveNextAsync() go <- step if step then // only create hashset by the time we actually start iterating - use hashSet = new ConcurrentHashSet<_>(CancellationToken()) + use hashSet = new ConcurrentHashSet<_>(CancellationToken.None) do hashSet.AddMany itemsToExclude while go do