diff --git a/benchmarks/FSharpBenchmarks/AsynchonousCompletionBenchmark.fs b/benchmarks/FSharpBenchmarks/AsynchonousCompletionBenchmark.fs index faddc2d..1bf2e99 100644 --- a/benchmarks/FSharpBenchmarks/AsynchonousCompletionBenchmark.fs +++ b/benchmarks/FSharpBenchmarks/AsynchonousCompletionBenchmark.fs @@ -23,19 +23,20 @@ module AsyncHelpers = let taskCTYield () = fun (ct: CancellationToken) -> Task.Yield() - let fsharp_tenBindAsync_AsyncBuilder () = async { - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - do! asyncYield () - return 100 - } + let fsharp_tenBindAsync_AsyncBuilder () = + async { + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + do! asyncYield () + return 100 + } let fsharp_tenBindAsync_PlyTaskBuilder () = FSharp.Control.Tasks.Affine.task { @@ -67,93 +68,99 @@ module AsyncHelpers = return 100 } - let fsharp_tenBindAsync_TaskBuilder () = task { - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - return 100 - } - - - let fsharp_tenBindAsync_ValueTaskBuilder () = valueTask { - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - return 100 - } - - - let fsharp_tenBindAsync_CancellableTaskBuilder () = cancellableTask { - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - return 100 - } - - - let fsharp_tenBindAsync_CancellableTaskBuilder_BindCancellableTask () = cancellableTask { - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - return 100 - } - - let fsharp_tenBindAsync_CancellableValueTaskBuilder () = cancellableValueTask { - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - do! taskYield () - return 100 - } - - - let fsharp_tenBindAsync_CancellableValueTaskBuilder_BindCancellableTask () = cancellableValueTask { - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - do! taskCTYield () - return 100 - } + let fsharp_tenBindAsync_TaskBuilder () = + task { + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + return 100 + } + + + let fsharp_tenBindAsync_ValueTaskBuilder () = + valueTask { + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + return 100 + } + + + let fsharp_tenBindAsync_CancellableTaskBuilder () = + cancellableTask { + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + return 100 + } + + + let fsharp_tenBindAsync_CancellableTaskBuilder_BindCancellableTask () = + cancellableTask { + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + return 100 + } + + let fsharp_tenBindAsync_CancellableValueTaskBuilder () = + cancellableValueTask { + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + do! taskYield () + return 100 + } + + + let fsharp_tenBindAsync_CancellableValueTaskBuilder_BindCancellableTask () = + cancellableValueTask { + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + do! taskCTYield () + return 100 + } [] diff --git a/benchmarks/FSharpBenchmarks/FileWritingBenchmarks.fs b/benchmarks/FSharpBenchmarks/FileWritingBenchmarks.fs index 339ae7f..818bfba 100644 --- a/benchmarks/FSharpBenchmarks/FileWritingBenchmarks.fs +++ b/benchmarks/FSharpBenchmarks/FileWritingBenchmarks.fs @@ -164,14 +164,15 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableTaskBuilder() = let path = getTempFileName () - let t = cancellableTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - do! file.WriteAsync(junk, 0, junk.Length) + for i = 1 to x.manyIterations do + do! file.WriteAsync(junk, 0, junk.Length) - } + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -183,14 +184,15 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableTaskBuilder_getCancellationTokenOnce() = let path = getTempFileName () - let t = cancellableTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) - let! ct = CancellableTask.getCancellationToken () + let t = + cancellableTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) + let! ct = CancellableTask.getCancellationToken () - for i = 1 to x.manyIterations do - do! file.WriteAsync(junk, 0, junk.Length, ct) - } + for i = 1 to x.manyIterations do + do! file.WriteAsync(junk, 0, junk.Length, ct) + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -201,14 +203,15 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableTaskBuilder_getCancellationTokenMany() = let path = getTempFileName () - let t = cancellableTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - let! ct = CancellableTask.getCancellationToken () - do! file.WriteAsync(junk, 0, junk.Length, ct) - } + for i = 1 to x.manyIterations do + let! ct = CancellableTask.getCancellationToken () + do! file.WriteAsync(junk, 0, junk.Length, ct) + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -219,13 +222,14 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableTaskBuilder_getCancellationTokenLambda() = let path = getTempFileName () - let t = cancellableTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - do! fun ct -> file.WriteAsync(junk, 0, junk.Length, ct) - } + for i = 1 to x.manyIterations do + do! fun ct -> file.WriteAsync(junk, 0, junk.Length, ct) + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -237,14 +241,15 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableValueTaskBuilder() = let path = getTempFileName () - let t = cancellableValueTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableValueTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - do! file.WriteAsync(junk, 0, junk.Length) + for i = 1 to x.manyIterations do + do! file.WriteAsync(junk, 0, junk.Length) - } + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -256,14 +261,15 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableValueTaskBuilder_getCancellationTokenOnce() = let path = getTempFileName () - let t = cancellableValueTask { - let! ct = CancellableValueTask.getCancellationToken () - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableValueTask { + let! ct = CancellableValueTask.getCancellationToken () + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - do! file.WriteAsync(junk, 0, junk.Length, ct) - } + for i = 1 to x.manyIterations do + do! file.WriteAsync(junk, 0, junk.Length, ct) + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -274,15 +280,16 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableValueTaskBuilder_getCancellationTokenMany() = let path = getTempFileName () - let t = cancellableValueTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableValueTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - let! ct = CancellableValueTask.getCancellationToken () - do! file.WriteAsync(junk, 0, junk.Length, ct) + for i = 1 to x.manyIterations do + let! ct = CancellableValueTask.getCancellationToken () + do! file.WriteAsync(junk, 0, junk.Length, ct) - } + } (t CancellationToken.None).GetAwaiter().GetResult() @@ -293,14 +300,15 @@ type FileWriteBenchmarks() = member x.FSharp_ManyWriteFile_CancellableValueTaskBuilder_getCancellationTokenLambda() = let path = getTempFileName () - let t = cancellableValueTask { - let junk = Array.zeroCreate x.bufferSize - use file = File.Create(path) + let t = + cancellableValueTask { + let junk = Array.zeroCreate x.bufferSize + use file = File.Create(path) - for i = 1 to x.manyIterations do - do! fun ct -> file.WriteAsync(junk, 0, junk.Length, ct) + for i = 1 to x.manyIterations do + do! fun ct -> file.WriteAsync(junk, 0, junk.Length, ct) - } + } (t CancellationToken.None).GetAwaiter().GetResult() diff --git a/benchmarks/FSharpBenchmarks/SynchonousCompletionBenchmark.fs b/benchmarks/FSharpBenchmarks/SynchonousCompletionBenchmark.fs index 3619615..d60014b 100644 --- a/benchmarks/FSharpBenchmarks/SynchonousCompletionBenchmark.fs +++ b/benchmarks/FSharpBenchmarks/SynchonousCompletionBenchmark.fs @@ -138,449 +138,466 @@ module SyncHelpers = } // ===== F# AsyncBuilder ===== - let fsharp_TenBindSync_AsyncBuilder_BindAsync () = async { - let! res1 = sync_Async () - let! res2 = sync_Async () - let! res3 = sync_Async () - let! res4 = sync_Async () - let! res5 = sync_Async () - let! res6 = sync_Async () - let! res7 = sync_Async () - let! res8 = sync_Async () - let! res9 = sync_Async () - let! res10 = sync_Async () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } + let fsharp_TenBindSync_AsyncBuilder_BindAsync () = + async { + let! res1 = sync_Async () + let! res2 = sync_Async () + let! res3 = sync_Async () + let! res4 = sync_Async () + let! res5 = sync_Async () + let! res6 = sync_Async () + let! res7 = sync_Async () + let! res8 = sync_Async () + let! res9 = sync_Async () + let! res10 = sync_Async () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } // ==== F# TaskBuilder ===== - let fsharp_TenBindSync_TaskBuilder_BindTask () = task { - let! res1 = sync_Task () - let! res2 = sync_Task () - let! res3 = sync_Task () - let! res4 = sync_Task () - let! res5 = sync_Task () - let! res6 = sync_Task () - let! res7 = sync_Task () - let! res8 = sync_Task () - let! res9 = sync_Task () - let! res10 = sync_Task () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - let fsharp_TenBindSync_TaskBuilder_BindValueTask () = task { - let! res1 = sync_ValueTask () - let! res2 = sync_ValueTask () - let! res3 = sync_ValueTask () - let! res4 = sync_ValueTask () - let! res5 = sync_ValueTask () - let! res6 = sync_ValueTask () - let! res7 = sync_ValueTask () - let! res8 = sync_ValueTask () - let! res9 = sync_ValueTask () - let! res10 = sync_ValueTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - let fsharp_TenBindSync_TaskBuilder_BindAsync () = task { - let! res1 = sync_Async () - let! res2 = sync_Async () - let! res3 = sync_Async () - let! res4 = sync_Async () - let! res5 = sync_Async () - let! res6 = sync_Async () - let! res7 = sync_Async () - let! res8 = sync_Async () - let! res9 = sync_Async () - let! res10 = sync_Async () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } + let fsharp_TenBindSync_TaskBuilder_BindTask () = + task { + let! res1 = sync_Task () + let! res2 = sync_Task () + let! res3 = sync_Task () + let! res4 = sync_Task () + let! res5 = sync_Task () + let! res6 = sync_Task () + let! res7 = sync_Task () + let! res8 = sync_Task () + let! res9 = sync_Task () + let! res10 = sync_Task () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + let fsharp_TenBindSync_TaskBuilder_BindValueTask () = + task { + let! res1 = sync_ValueTask () + let! res2 = sync_ValueTask () + let! res3 = sync_ValueTask () + let! res4 = sync_ValueTask () + let! res5 = sync_ValueTask () + let! res6 = sync_ValueTask () + let! res7 = sync_ValueTask () + let! res8 = sync_ValueTask () + let! res9 = sync_ValueTask () + let! res10 = sync_ValueTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + let fsharp_TenBindSync_TaskBuilder_BindAsync () = + task { + let! res1 = sync_Async () + let! res2 = sync_Async () + let! res3 = sync_Async () + let! res4 = sync_Async () + let! res5 = sync_Async () + let! res6 = sync_Async () + let! res7 = sync_Async () + let! res8 = sync_Async () + let! res9 = sync_Async () + let! res10 = sync_Async () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } // ==== F# ValueTaskBuilder ===== - let fsharp_TenBindSync_ValueTaskBuilder_BindTask () = valueTask { - let! res1 = sync_Task () - let! res2 = sync_Task () - let! res3 = sync_Task () - let! res4 = sync_Task () - let! res5 = sync_Task () - let! res6 = sync_Task () - let! res7 = sync_Task () - let! res8 = sync_Task () - let! res9 = sync_Task () - let! res10 = sync_Task () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_ValueTaskBuilder_BindValueTask () = valueTask { - let! res1 = sync_ValueTask () - let! res2 = sync_ValueTask () - let! res3 = sync_ValueTask () - let! res4 = sync_ValueTask () - let! res5 = sync_ValueTask () - let! res6 = sync_ValueTask () - let! res7 = sync_ValueTask () - let! res8 = sync_ValueTask () - let! res9 = sync_ValueTask () - let! res10 = sync_ValueTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - let fsharp_TenBindSync_ValueTaskBuilder_BindAsync () = valueTask { - let! res1 = sync_Async () - let! res2 = sync_Async () - let! res3 = sync_Async () - let! res4 = sync_Async () - let! res5 = sync_Async () - let! res6 = sync_Async () - let! res7 = sync_Async () - let! res8 = sync_Async () - let! res9 = sync_Async () - let! res10 = sync_Async () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } + let fsharp_TenBindSync_ValueTaskBuilder_BindTask () = + valueTask { + let! res1 = sync_Task () + let! res2 = sync_Task () + let! res3 = sync_Task () + let! res4 = sync_Task () + let! res5 = sync_Task () + let! res6 = sync_Task () + let! res7 = sync_Task () + let! res8 = sync_Task () + let! res9 = sync_Task () + let! res10 = sync_Task () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_ValueTaskBuilder_BindValueTask () = + valueTask { + let! res1 = sync_ValueTask () + let! res2 = sync_ValueTask () + let! res3 = sync_ValueTask () + let! res4 = sync_ValueTask () + let! res5 = sync_ValueTask () + let! res6 = sync_ValueTask () + let! res7 = sync_ValueTask () + let! res8 = sync_ValueTask () + let! res9 = sync_ValueTask () + let! res10 = sync_ValueTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + let fsharp_TenBindSync_ValueTaskBuilder_BindAsync () = + valueTask { + let! res1 = sync_Async () + let! res2 = sync_Async () + let! res3 = sync_Async () + let! res4 = sync_Async () + let! res5 = sync_Async () + let! res6 = sync_Async () + let! res7 = sync_Async () + let! res8 = sync_Async () + let! res9 = sync_Async () + let! res10 = sync_Async () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } /// ==== F# CancellableTaskBuilder ===== - let fsharp_TenBindSync_CancellableTaskBuilder_BindCancellableTask () = cancellableTask { - let! res1 = sync_cancellableTask () - let! res2 = sync_cancellableTask () - let! res3 = sync_cancellableTask () - let! res4 = sync_cancellableTask () - let! res5 = sync_cancellableTask () - let! res6 = sync_cancellableTask () - let! res7 = sync_cancellableTask () - let! res8 = sync_cancellableTask () - let! res9 = sync_cancellableTask () - let! res10 = sync_cancellableTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableTaskBuilder_BindTask () = cancellableTask { - let! res1 = sync_Task () - let! res2 = sync_Task () - let! res3 = sync_Task () - let! res4 = sync_Task () - let! res5 = sync_Task () - let! res6 = sync_Task () - let! res7 = sync_Task () - let! res8 = sync_Task () - let! res9 = sync_Task () - let! res10 = sync_Task () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableTaskBuilder_BindValueTask () = cancellableTask { - let! res1 = sync_ValueTask () - let! res2 = sync_ValueTask () - let! res3 = sync_ValueTask () - let! res4 = sync_ValueTask () - let! res5 = sync_ValueTask () - let! res6 = sync_ValueTask () - let! res7 = sync_ValueTask () - let! res8 = sync_ValueTask () - let! res9 = sync_ValueTask () - let! res10 = sync_ValueTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableTaskBuilder_BindCancellableValueTask () = cancellableTask { - let! res1 = sync_cancellableValueTask () - let! res2 = sync_cancellableValueTask () - let! res3 = sync_cancellableValueTask () - let! res4 = sync_cancellableValueTask () - let! res5 = sync_cancellableValueTask () - let! res6 = sync_cancellableValueTask () - let! res7 = sync_cancellableValueTask () - let! res8 = sync_cancellableValueTask () - let! res9 = sync_cancellableValueTask () - let! res10 = sync_cancellableValueTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableTaskBuilder_BindAsync () = cancellableTask { - let! res1 = sync_Async () - let! res2 = sync_Async () - let! res3 = sync_Async () - let! res4 = sync_Async () - let! res5 = sync_Async () - let! res6 = sync_Async () - let! res7 = sync_Async () - let! res8 = sync_Async () - let! res9 = sync_Async () - let! res10 = sync_Async () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } + let fsharp_TenBindSync_CancellableTaskBuilder_BindCancellableTask () = + cancellableTask { + let! res1 = sync_cancellableTask () + let! res2 = sync_cancellableTask () + let! res3 = sync_cancellableTask () + let! res4 = sync_cancellableTask () + let! res5 = sync_cancellableTask () + let! res6 = sync_cancellableTask () + let! res7 = sync_cancellableTask () + let! res8 = sync_cancellableTask () + let! res9 = sync_cancellableTask () + let! res10 = sync_cancellableTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableTaskBuilder_BindTask () = + cancellableTask { + let! res1 = sync_Task () + let! res2 = sync_Task () + let! res3 = sync_Task () + let! res4 = sync_Task () + let! res5 = sync_Task () + let! res6 = sync_Task () + let! res7 = sync_Task () + let! res8 = sync_Task () + let! res9 = sync_Task () + let! res10 = sync_Task () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableTaskBuilder_BindValueTask () = + cancellableTask { + let! res1 = sync_ValueTask () + let! res2 = sync_ValueTask () + let! res3 = sync_ValueTask () + let! res4 = sync_ValueTask () + let! res5 = sync_ValueTask () + let! res6 = sync_ValueTask () + let! res7 = sync_ValueTask () + let! res8 = sync_ValueTask () + let! res9 = sync_ValueTask () + let! res10 = sync_ValueTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableTaskBuilder_BindCancellableValueTask () = + cancellableTask { + let! res1 = sync_cancellableValueTask () + let! res2 = sync_cancellableValueTask () + let! res3 = sync_cancellableValueTask () + let! res4 = sync_cancellableValueTask () + let! res5 = sync_cancellableValueTask () + let! res6 = sync_cancellableValueTask () + let! res7 = sync_cancellableValueTask () + let! res8 = sync_cancellableValueTask () + let! res9 = sync_cancellableValueTask () + let! res10 = sync_cancellableValueTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableTaskBuilder_BindAsync () = + cancellableTask { + let! res1 = sync_Async () + let! res2 = sync_Async () + let! res3 = sync_Async () + let! res4 = sync_Async () + let! res5 = sync_Async () + let! res6 = sync_Async () + let! res7 = sync_Async () + let! res8 = sync_Async () + let! res9 = sync_Async () + let! res10 = sync_Async () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } // ==== F# CancellableValueTaskBuilder ===== - let fsharp_TenBindSync_CancellableValueTaskBuilder_BindCancellableTask () = cancellableValueTask { - let! res1 = sync_cancellableTask () - let! res2 = sync_cancellableTask () - let! res3 = sync_cancellableTask () - let! res4 = sync_cancellableTask () - let! res5 = sync_cancellableTask () - let! res6 = sync_cancellableTask () - let! res7 = sync_cancellableTask () - let! res8 = sync_cancellableTask () - let! res9 = sync_cancellableTask () - let! res10 = sync_cancellableTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableValueTaskBuilder_BindTask () = cancellableValueTask { - let! res1 = sync_Task () - let! res2 = sync_Task () - let! res3 = sync_Task () - let! res4 = sync_Task () - let! res5 = sync_Task () - let! res6 = sync_Task () - let! res7 = sync_Task () - let! res8 = sync_Task () - let! res9 = sync_Task () - let! res10 = sync_Task () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableValueTaskBuilder_BindValueTask () = cancellableValueTask { - let! res1 = sync_ValueTask () - let! res2 = sync_ValueTask () - let! res3 = sync_ValueTask () - let! res4 = sync_ValueTask () - let! res5 = sync_ValueTask () - let! res6 = sync_ValueTask () - let! res7 = sync_ValueTask () - let! res8 = sync_ValueTask () - let! res9 = sync_ValueTask () - let! res10 = sync_ValueTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableValueTaskBuilder_BindCancellableValueTask () = cancellableValueTask { - let! res1 = sync_cancellableValueTask () - let! res2 = sync_cancellableValueTask () - let! res3 = sync_cancellableValueTask () - let! res4 = sync_cancellableValueTask () - let! res5 = sync_cancellableValueTask () - let! res6 = sync_cancellableValueTask () - let! res7 = sync_cancellableValueTask () - let! res8 = sync_cancellableValueTask () - let! res9 = sync_cancellableValueTask () - let! res10 = sync_cancellableValueTask () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } - - - let fsharp_TenBindSync_CancellableValueTaskBuilder_BindAsync () = cancellableValueTask { - let! res1 = sync_Async () - let! res2 = sync_Async () - let! res3 = sync_Async () - let! res4 = sync_Async () - let! res5 = sync_Async () - let! res6 = sync_Async () - let! res7 = sync_Async () - let! res8 = sync_Async () - let! res9 = sync_Async () - let! res10 = sync_Async () - - return - res1 - + res2 - + res3 - + res4 - + res5 - + res6 - + res7 - + res8 - + res9 - + res10 - } + let fsharp_TenBindSync_CancellableValueTaskBuilder_BindCancellableTask () = + cancellableValueTask { + let! res1 = sync_cancellableTask () + let! res2 = sync_cancellableTask () + let! res3 = sync_cancellableTask () + let! res4 = sync_cancellableTask () + let! res5 = sync_cancellableTask () + let! res6 = sync_cancellableTask () + let! res7 = sync_cancellableTask () + let! res8 = sync_cancellableTask () + let! res9 = sync_cancellableTask () + let! res10 = sync_cancellableTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableValueTaskBuilder_BindTask () = + cancellableValueTask { + let! res1 = sync_Task () + let! res2 = sync_Task () + let! res3 = sync_Task () + let! res4 = sync_Task () + let! res5 = sync_Task () + let! res6 = sync_Task () + let! res7 = sync_Task () + let! res8 = sync_Task () + let! res9 = sync_Task () + let! res10 = sync_Task () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableValueTaskBuilder_BindValueTask () = + cancellableValueTask { + let! res1 = sync_ValueTask () + let! res2 = sync_ValueTask () + let! res3 = sync_ValueTask () + let! res4 = sync_ValueTask () + let! res5 = sync_ValueTask () + let! res6 = sync_ValueTask () + let! res7 = sync_ValueTask () + let! res8 = sync_ValueTask () + let! res9 = sync_ValueTask () + let! res10 = sync_ValueTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableValueTaskBuilder_BindCancellableValueTask () = + cancellableValueTask { + let! res1 = sync_cancellableValueTask () + let! res2 = sync_cancellableValueTask () + let! res3 = sync_cancellableValueTask () + let! res4 = sync_cancellableValueTask () + let! res5 = sync_cancellableValueTask () + let! res6 = sync_cancellableValueTask () + let! res7 = sync_cancellableValueTask () + let! res8 = sync_cancellableValueTask () + let! res9 = sync_cancellableValueTask () + let! res10 = sync_cancellableValueTask () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } + + + let fsharp_TenBindSync_CancellableValueTaskBuilder_BindAsync () = + cancellableValueTask { + let! res1 = sync_Async () + let! res2 = sync_Async () + let! res3 = sync_Async () + let! res4 = sync_Async () + let! res5 = sync_Async () + let! res6 = sync_Async () + let! res7 = sync_Async () + let! res8 = sync_Async () + let! res9 = sync_Async () + let! res10 = sync_Async () + + return + res1 + + res2 + + res3 + + res4 + + res5 + + res6 + + res7 + + res8 + + res9 + + res10 + } [] // [] diff --git a/build/FsDocs.fs b/build/FsDocs.fs index 0703673..d69b452 100644 --- a/build/FsDocs.fs +++ b/build/FsDocs.fs @@ -14,71 +14,70 @@ module Fsdocs = /// /// Fsdocs build command parameters and options /// - type BuildCommandParams = - { - /// Input directory of content (default: docs) - Input: string option + type BuildCommandParams = { + /// Input directory of content (default: docs) + Input: string option - /// Project files to build API docs for outputs, defaults to all packable projects - Projects: seq option + /// Project files to build API docs for outputs, defaults to all packable projects + Projects: seq option - /// Output Directory (default output for build and tmp/watch for watch) - Output: string option + /// Output Directory (default output for build and tmp/watch for watch) + Output: string option - /// Disable generation of API docs - NoApiDocs: bool option + /// Disable generation of API docs + NoApiDocs: bool option - /// Evaluate F# fragments in scripts - Eval: bool option + /// Evaluate F# fragments in scripts + Eval: bool option - /// Save images referenced in docs - SaveImages: bool option + /// Save images referenced in docs + SaveImages: bool option - /// Add line numbers - LineNumbers: bool option + /// Add line numbers + LineNumbers: bool option - /// Additional substitution parameters for templates - Parameters: seq option + /// Additional substitution parameters for templates + Parameters: seq option - /// Disable project cracking. - IgnoreProjects: bool option + /// Disable project cracking. + IgnoreProjects: bool option - /// In API doc generation qualify the output by the collection name, e.g. 'reference/FSharp.Core/...' instead of 'reference/...' . - Qualify: bool option + /// In API doc generation qualify the output by the collection name, e.g. 'reference/FSharp.Core/...' instead of 'reference/...' . + Qualify: bool option - /// The tool will also generate documentation for non-public members - NoPublic: bool option + /// The tool will also generate documentation for non-public members + NoPublic: bool option - /// Do not copy default content styles, javascript or use default templates - NoDefaultContent: bool option + /// Do not copy default content styles, javascript or use default templates + NoDefaultContent: bool option - /// Clean the output directory - Clean: bool option + /// Clean the output directory + Clean: bool option - /// Display version information - Version: bool option + /// Display version information + Version: bool option - /// Provide properties to dotnet msbuild, e.g. --properties Configuration=Release Version=3.4 - Properties: string option + /// Provide properties to dotnet msbuild, e.g. --properties Configuration=Release Version=3.4 + Properties: string option - /// Additional arguments passed down as otherflags to the F# compiler when the API is being generated. - /// Note that these arguments are trimmed, this is to overcome a limitation in the command line argument - /// processing. A typical use-case would be to pass an addition assembly reference. - /// Example --fscoptions " -r:MyAssembly.dll" - FscOptions: string option + /// Additional arguments passed down as otherflags to the F# compiler when the API is being generated. + /// Note that these arguments are trimmed, this is to overcome a limitation in the command line argument + /// processing. A typical use-case would be to pass an addition assembly reference. + /// Example --fscoptions " -r:MyAssembly.dll" + FscOptions: string option - /// Fail if docs are missing or can't be generated - Strict: bool option + /// Fail if docs are missing or can't be generated + Strict: bool option - /// Source folder at time of component build (<FsDocsSourceFolder>) - SourceFolder: string option + /// Source folder at time of component build (<FsDocsSourceFolder>) + SourceFolder: string option - /// Source repository for github links (<FsDocsSourceRepository>) - SourceRepository: string option + /// Source repository for github links (<FsDocsSourceRepository>) + SourceRepository: string option - /// Assume comments in F# code are markdown (<UsesMarkdownComments>) - MdComments: bool option - } + /// Assume comments in F# code are markdown (<UsesMarkdownComments>) + MdComments: bool option + } with /// Parameter default values. static member Default = { @@ -107,23 +106,22 @@ module Fsdocs = /// /// Fsdocs watch command parameters and options /// - type WatchCommandParams = - { - /// Do not serve content when watching. - NoServer: bool option + type WatchCommandParams = { + /// Do not serve content when watching. + NoServer: bool option - /// Do not launch a browser window. - NoLaunch: bool option + /// Do not launch a browser window. + NoLaunch: bool option - /// URL extension to launch http://localhost:/%s. - Open: string option + /// URL extension to launch http://localhost:/%s. + Open: string option - /// Port to serve content for http://localhost serving. - Port: int option + /// Port to serve content for http://localhost serving. + Port: int option - /// Build Commands - BuildCommandParams: BuildCommandParams option - } + /// Build Commands + BuildCommandParams: BuildCommandParams option + } with /// Parameter default values. static member Default = { diff --git a/build/build.fs b/build/build.fs index 48b7c10..0b80b3e 100644 --- a/build/build.fs +++ b/build/build.fs @@ -282,8 +282,9 @@ module Changelog = | Some desc when desc.Contains(linkReference) -> desc | Some desc -> sprintf "%s\n\n%s" (desc.Trim()) linkReference - { latestEntry with - Description = Some description + { + latestEntry with + Description = Some description } .ToString() @@ -365,13 +366,13 @@ module FSharpAnalyzers = module DocsTool = let quoted s = $"\"%s{s}\"" - let fsDocsDotnetOptions (o: DotNet.Options) = - { o with + let fsDocsDotnetOptions (o: DotNet.Options) = { + o with WorkingDirectory = rootDirectory - } + } - let fsDocsBuildParams configuration (p: Fsdocs.BuildCommandParams) = - { p with + let fsDocsBuildParams configuration (p: Fsdocs.BuildCommandParams) = { + p with Clean = Some true Input = Some(quoted docsSrcDir) Output = Some(quoted docsDir) @@ -390,7 +391,7 @@ module DocsTool = "fsdocs-release-notes-link", quoted (CHANGELOGlink.ToString()) ] Strict = Some true - } + } let cleanDocsCache () = Fsdocs.cleanCache rootDirectory @@ -405,18 +406,18 @@ module DocsTool = Option.defaultValue Fsdocs.BuildCommandParams.Default bp |> fsDocsBuildParams configuration - { bp with - Output = Some watchDocsDir - Strict = None + { + bp with + Output = Some watchDocsDir + Strict = None } Fsdocs.watch fsDocsDotnetOptions - (fun p -> - { p with + (fun p -> { + p with BuildCommandParams = Some(buildParams p.BuildCommandParams) - } - ) + }) let allReleaseChecks () = isReleaseBranchCheck () @@ -471,13 +472,12 @@ let dotnetRestore _ = |> String.concat " " DotNet.restore - (fun c -> - { c with + (fun c -> { + c with Common = c.Common |> DotNet.Options.withCustomParams (Some(args)) - } - ) + }) dir ) |> Seq.iter (retryIfInCI 10) @@ -664,15 +664,14 @@ let dotnetBuild ctx = ] DotNet.build - (fun c -> - { c with + (fun c -> { + c with Configuration = configuration (ctx.Context.AllExecutingTargets) Common = c.Common |> DotNet.Options.withAdditionalArgs args - } - ) + }) sln let fsharpAnalyzers _ = @@ -714,13 +713,13 @@ let dotnetTest ctx = DotNet.test (fun c -> - { c with - Configuration = configuration (ctx.Context.AllExecutingTargets) - Common = - c.Common - |> DotNet.Options.withAdditionalArgs args - } - ) + { + c with + Configuration = configuration (ctx.Context.AllExecutingTargets) + Common = + c.Common + |> DotNet.Options.withAdditionalArgs args + }) sln let generateCoverageReport _ = @@ -847,15 +846,14 @@ let dotnetPack ctx = ] DotNet.pack - (fun c -> - { c with + (fun c -> { + c with Configuration = configuration (ctx.Context.AllExecutingTargets) OutputPath = Some distDir Common = c.Common |> DotNet.Options.withAdditionalArgs args - } - ) + }) sln let sourceLinkTest _ = @@ -865,8 +863,8 @@ let sourceLinkTest _ = let publishToNuget _ = allPublishChecks () - Paket.push (fun c -> - { c with + Paket.push (fun c -> { + c with ToolType = ToolType.CreateLocalTool() PublishUrl = publishUrl WorkingDir = "dist" @@ -874,8 +872,7 @@ let publishToNuget _ = match nugetToken with | Some s -> s | _ -> c.ApiKey // assume paket-config was set properly - } - ) + }) // If build fails after this point, we've pushed a release out with this version of CHANGELOG.md so we should keep it around Target.deactivateBuildFailure "RevertChangelog" diff --git a/docsSrc/How-To-Guides/Cancellable-Task-In-Falco.fsx b/docsSrc/How-To-Guides/Cancellable-Task-In-Falco.fsx index 03e351e..ca1442e 100644 --- a/docsSrc/How-To-Guides/Cancellable-Task-In-Falco.fsx +++ b/docsSrc/How-To-Guides/Cancellable-Task-In-Falco.fsx @@ -33,22 +33,22 @@ open Falco.Routing // This is a stand in for some real database call like Npgsql where it would take a CancellationToken type Database = - static member Get(query, queryParams, cancellationToken: CancellationToken) = task { - do! Task.Delay(10) - } + static member Get(query, queryParams, cancellationToken: CancellationToken) = + task { do! Task.Delay(10) } module ExampleVerbose = // Some function that's doing the real handler's work - let myRealWork ctx = cancellableTask { - // use a lamdbda to get the cancellableTask's current CancellationToken - let! result = - fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) + let myRealWork ctx = + cancellableTask { + // use a lamdbda to get the cancellableTask's current CancellationToken + let! result = + fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) - return! Response.ofJson result ctx - } + return! Response.ofJson result ctx + } // A helper to get the context's RequestAborted CancellationToken which will give the cancellableTask // the context to pass long. @@ -118,12 +118,13 @@ module RoutingC = module ExampleRefactor1 = // Some function that's doing the real handler's work - let myRealWork ctx = cancellableTask { - // use a lamdbda to get the cancellableTask's current CancellationToken - let! result = - fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) + let myRealWork ctx = + cancellableTask { + // use a lamdbda to get the cancellableTask's current CancellationToken + let! result = + fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) - return! Response.ofJson result ctx - } + return! Response.ofJson result ctx + } let endpoints = [ RoutingC.get "/" myRealWork ] diff --git a/docsSrc/How-To-Guides/Cancellable-Task-In-Giraffe.fsx b/docsSrc/How-To-Guides/Cancellable-Task-In-Giraffe.fsx index 5364274..6d68526 100644 --- a/docsSrc/How-To-Guides/Cancellable-Task-In-Giraffe.fsx +++ b/docsSrc/How-To-Guides/Cancellable-Task-In-Giraffe.fsx @@ -31,29 +31,30 @@ open Giraffe // This is a stand in for some real database call like Npgsql where it would take a CancellationToken type Database = - static member Get(query, queryParams, cancellationToken: CancellationToken) = task { - do! Task.Delay(10) - } + static member Get(query, queryParams, cancellationToken: CancellationToken) = + task { do! Task.Delay(10) } module ExampleVerbose = // Some function that's doing the real handler's work - let myRealWork next ctx = cancellableTask { - // use a lamdbda to get the cancellableTask's current CancellationToken - let! result = - fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) + let myRealWork next ctx = + cancellableTask { + // use a lamdbda to get the cancellableTask's current CancellationToken + let! result = + fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) - return! json result next ctx - } + return! json result next ctx + } // A helper to get the context's RequestAborted CancellationToken which will give the cancellableTask // the context to pass long. - let myCustomHandler next (ctx: HttpContext) = task { - let cancellationToken = ctx.RequestAborted - return! myRealWork next ctx cancellationToken - } + let myCustomHandler next (ctx: HttpContext) = + task { + let cancellationToken = ctx.RequestAborted + return! myRealWork next ctx cancellationToken + } // Some Giraffe App let app: HttpFunc -> HttpContext -> HttpFuncResult = @@ -77,13 +78,14 @@ module ExampleRefactor1 = task { return! cancellableHandler next ctx ctx.RequestAborted } // Some function that's doing the real handler's work - let myRealWork next ctx = cancellableTask { - // use a lamdbda to get the cancellableTask's current CancellationToken - let! result = - fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) - - return! json result next ctx - } + let myRealWork next ctx = + cancellableTask { + // use a lamdbda to get the cancellableTask's current CancellationToken + let! result = + fun ct -> Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", "buzz" ], ct) + + return! json result next ctx + } // Some Giraffe App diff --git a/docsSrc/Tutorials/Tutorial-3.fsx b/docsSrc/Tutorials/Tutorial-3.fsx index d908aa2..1b09346 100644 --- a/docsSrc/Tutorials/Tutorial-3.fsx +++ b/docsSrc/Tutorials/Tutorial-3.fsx @@ -31,60 +31,65 @@ module Task = type Person = { Name: string; Age: int } type Database = - static member Get<'a>(query, queryParams, cancellationToken: CancellationToken) = task { - do! Task.Delay(1000, cancellationToken) - return { Name = "Foo"; Age = 42 } - } + static member Get<'a>(query, queryParams, cancellationToken: CancellationToken) = + task { + do! Task.Delay(1000, cancellationToken) + return { Name = "Foo"; Age = 42 } + } // Stand in for some web call type WebCall = - static member HttpGet(route, cancellationToken: CancellationToken) = task { - do! Task.Delay(1000, cancellationToken) - return { Name = "Foo"; Age = 42 } + static member HttpGet(route, cancellationToken: CancellationToken) = + task { + do! Task.Delay(1000, cancellationToken) + return { Name = "Foo"; Age = 42 } + } + +let someOtherBusinessLogic (person: Person) = + cancellableTask { + let! ct = CancellableTask.getCancellationToken () // A helper to get the current CancellationToken + let! result = WebCall.HttpGet("https://example.com", ct) + return result.Age < 1000 // prevent vampires from using our app + } + +let cacheItem (key: string) value = + async { + let! ct = Async.CancellationToken // This token will come from the cancellable task + + let! result = + Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", key ], ct) + |> Async.AwaitTask + + return () } -let someOtherBusinessLogic (person: Person) = cancellableTask { - let! ct = CancellableTask.getCancellationToken () // A helper to get the current CancellationToken - let! result = WebCall.HttpGet("https://example.com", ct) - return result.Age < 1000 // prevent vampires from using our app -} - -let cacheItem (key: string) value = async { - let! ct = Async.CancellationToken // This token will come from the cancellable task - - let! result = - Database.Get("SELECT foo FROM bar where baz = @0", [ "@0", key ], ct) - |> Async.AwaitTask - - return () -} - -let businessLayerCall someParameter = cancellableTask { - // use a lamdbda to get the cancellableTask's current CancellationToken - // then bind against it like you normally would in any other computation expression - let! result = - fun cancellationToken -> - Database.Get( - "SELECT foo FROM bar where baz = @0", - [ "@0", someParameter ], - cancellationToken - ) - - // This will implicitly pass the CancellationToken along to the next cancellableTask - let! notVampire = someOtherBusinessLogic result - - // This will implicitly pass the CancellationToken along to async computation expressions as well - do! cacheItem "buzz" result - - // Conduct some business logic - if - result.Age > 18 - && notVampire - then - return Some result - else - return None -} +let businessLayerCall someParameter = + cancellableTask { + // use a lamdbda to get the cancellableTask's current CancellationToken + // then bind against it like you normally would in any other computation expression + let! result = + fun cancellationToken -> + Database.Get( + "SELECT foo FROM bar where baz = @0", + [ "@0", someParameter ], + cancellationToken + ) + + // This will implicitly pass the CancellationToken along to the next cancellableTask + let! notVampire = someOtherBusinessLogic result + + // This will implicitly pass the CancellationToken along to async computation expressions as well + do! cacheItem "buzz" result + + // Conduct some business logic + if + result.Age > 18 + && notVampire + then + return Some result + else + return None + } // Now we can use our businessLayerCall like any other Task diff --git a/examples/DatabaseDemo/Program.fs b/examples/DatabaseDemo/Program.fs index 3f21210..2f87bc6 100644 --- a/examples/DatabaseDemo/Program.fs +++ b/examples/DatabaseDemo/Program.fs @@ -21,42 +21,49 @@ module Database = Password = "postgres" ) - let doSlowWorkAsync (conn: IDbConnection) = async { - let! ct = Async.CancellationToken - let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) + let doSlowWorkAsync (conn: IDbConnection) = + async { + let! ct = Async.CancellationToken + let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) - let! _ = - conn.QueryAsync(cmdDef) - |> Async.AwaitTask + let! _ = + conn.QueryAsync(cmdDef) + |> Async.AwaitTask - () - } + () + } - let doSlowWork1 (conn: IDbConnection) = task { - let! _ = conn.QueryAsync("select pg_sleep(10)") - () - } + let doSlowWork1 (conn: IDbConnection) = + task { + let! _ = conn.QueryAsync("select pg_sleep(10)") + () + } - let doSlowWork2 (ct: CancellationToken) (conn: IDbConnection) = task { - let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) - let! _ = conn.QueryAsync(cmdDef) - () - } + let doSlowWork2 (ct: CancellationToken) (conn: IDbConnection) = + task { + let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) + let! _ = conn.QueryAsync(cmdDef) + () + } // CancellableTask<'T> = CancellationToken -> Task<'T> - let doSlowWork3 (conn: IDbConnection) = cancellableTask { - let! ct = CancellableTask.getCancellationToken () - let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) - let! _ = conn.QueryAsync(cmdDef) - () - } - // CancellableTask<'T> = CancellationToken -> Task<'T> - let doSlowWork3b (conn: IDbConnection) = cancellableTask { - let! _ = fun ct -> + let doSlowWork3 (conn: IDbConnection) = + cancellableTask { + let! ct = CancellableTask.getCancellationToken () let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) - conn.QueryAsync(cmdDef) - () - } + let! _ = conn.QueryAsync(cmdDef) + () + } + // CancellableTask<'T> = CancellationToken -> Task<'T> + let doSlowWork3b (conn: IDbConnection) = + cancellableTask { + let! _ = + fun ct -> + let cmdDef = CommandDefinition("select pg_sleep(10)", cancellationToken = ct) + conn.QueryAsync(cmdDef) + + () + } open Database @@ -64,28 +71,31 @@ let webApp = choose [ // This is not using CancellationTokens route "/simpleExample1" - >=> fun next ctx -> task { - use conn = new Npgsql.NpgsqlConnection(connStr.ToString()) - do! doSlowWork1 (conn) - return! next ctx - } + >=> fun next ctx -> + task { + use conn = new Npgsql.NpgsqlConnection(connStr.ToString()) + do! doSlowWork1 (conn) + return! next ctx + } // This is using CancellationTokens explicitly route "/simpleExample2" - >=> fun next ctx -> task { - use conn = new Npgsql.NpgsqlConnection(connStr.ToString()) - do! doSlowWork2 ctx.RequestAborted conn - return! next ctx - } + >=> fun next ctx -> + task { + use conn = new Npgsql.NpgsqlConnection(connStr.ToString()) + do! doSlowWork2 ctx.RequestAborted conn + return! next ctx + } // This is using CancellationTokens at the top level and only when needed route "/simpleExample3" - >=> fun next ctx -> task { - use conn = new Npgsql.NpgsqlConnection(connStr.ToString()) - do! doSlowWork3 conn ctx.RequestAborted - return! next ctx - } + >=> fun next ctx -> + task { + use conn = new Npgsql.NpgsqlConnection(connStr.ToString()) + do! doSlowWork3 conn ctx.RequestAborted + return! next ctx + } ] module BusinessLogic = @@ -94,37 +104,42 @@ module BusinessLogic = let preserveEndocrins (logger: ILogger) () = task { do! Task.Delay(100) } - let monotonectallyImplementErrorFreeConvergence (logger: ILogger) id = task { - let! _ = preserveEndocrins logger () - return id - } - - let fungiblyFacilitateTechnicallySoundResults id conn = task { - let! _ = Database.doSlowWork1 conn - () - } - - let completelyTransitionBackendRelationships () = task { - //send an email? - () - } - - let continuallyActualizeImperatives (logger: ILogger) (conn) = task { - for i = 0 to 100000 do - let! r1 = monotonectallyImplementErrorFreeConvergence logger i - let! _ = fungiblyFacilitateTechnicallySoundResults r1 conn + let monotonectallyImplementErrorFreeConvergence (logger: ILogger) id = + task { + let! _ = preserveEndocrins logger () + return id + } + + let fungiblyFacilitateTechnicallySoundResults id conn = + task { + let! _ = Database.doSlowWork1 conn () - } + } - let reticulatingSplines (logger: ILogger) (caching: IDistributedCache) (conn) = task { - logger.LogDebug("Started reticulatingSplines") - let! _ = preserveEndocrins logger () - logger.LogInformation("preserveEndocrins might be doing something strange?") - let! _ = Database.doSlowWork1 conn - let! _ = continuallyActualizeImperatives logger conn - let! _ = completelyTransitionBackendRelationships () - () - } + let completelyTransitionBackendRelationships () = + task { + //send an email? + () + } + + let continuallyActualizeImperatives (logger: ILogger) (conn) = + task { + for i = 0 to 100000 do + let! r1 = monotonectallyImplementErrorFreeConvergence logger i + let! _ = fungiblyFacilitateTechnicallySoundResults r1 conn + () + } + + let reticulatingSplines (logger: ILogger) (caching: IDistributedCache) (conn) = + task { + logger.LogDebug("Started reticulatingSplines") + let! _ = preserveEndocrins logger () + logger.LogInformation("preserveEndocrins might be doing something strange?") + let! _ = Database.doSlowWork1 conn + let! _ = continuallyActualizeImperatives logger conn + let! _ = completelyTransitionBackendRelationships () + () + } module BusinessLogic2 = @@ -132,9 +147,8 @@ module BusinessLogic2 = open System.Threading.Tasks open Microsoft.Extensions.Caching.Distributed - let preserveEndocrins (logger: ILogger) (ct: CancellationToken) () = task { - do! Task.Delay(100, ct) - } + let preserveEndocrins (logger: ILogger) (ct: CancellationToken) () = + task { do! Task.Delay(100, ct) } let monotonectallyImplementErrorFreeConvergence (ct: CancellationToken) (logger: ILogger) id = task { @@ -185,11 +199,12 @@ module BusinessLogic3 = open Microsoft.Extensions.Caching.Distributed open IcedTasks - let preserveEndocrins (logger: ILogger) () = cancellableTask { - // You can bind against `CancellationToken -> Task<'T>` calls - // no need for `CancellableTask.getCancellationToken()`. - do! fun ct -> Task.Delay(100, ct) - } + let preserveEndocrins (logger: ILogger) () = + cancellableTask { + // You can bind against `CancellationToken -> Task<'T>` calls + // no need for `CancellableTask.getCancellationToken()`. + do! fun ct -> Task.Delay(100, ct) + } let monotonectallyImplementErrorFreeConvergence (logger: ILogger) id = cancellableTask { diff --git a/generate-sdk-references.fsx b/generate-sdk-references.fsx index 8baaefe..dc2f538 100644 --- a/generate-sdk-references.fsx +++ b/generate-sdk-references.fsx @@ -24,10 +24,11 @@ let getRuntimeList () = let proc = Process.Start(psi) proc.WaitForExit() - let output = seq { - while not proc.StandardOutput.EndOfStream do - proc.StandardOutput.ReadLine() - } + let output = + seq { + while not proc.StandardOutput.EndOfStream do + proc.StandardOutput.ReadLine() + } /// Regex for output like: Microsoft.AspNetCore.App 5.0.13 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] let listRuntimesRegex = Regex("([^\s]+) ([^\s]+) \[(.*?)\\]") diff --git a/src/IcedTasks/AsyncEx.fs b/src/IcedTasks/AsyncEx.fs index c211317..f920d0c 100644 --- a/src/IcedTasks/AsyncEx.fs +++ b/src/IcedTasks/AsyncEx.fs @@ -280,10 +280,11 @@ type AsyncExBuilder() = [] compensation: unit -> ValueTask ) : Async<'ok> = - let compensation = async { - let vTask = compensation () - return! Async.AwaitValueTask vTask - } + let compensation = + async { + let vTask = compensation () + return! Async.AwaitValueTask vTask + } Async.TryFinallyAsync(computation, compensation) diff --git a/src/IcedTasks/CancellableTask.fs b/src/IcedTasks/CancellableTask.fs index a8fbd26..89ffb31 100644 --- a/src/IcedTasks/CancellableTask.fs +++ b/src/IcedTasks/CancellableTask.fs @@ -871,10 +871,11 @@ module CancellableTasks = /// /// This is based on Async.Await overload (esp. AwaitTask without throwing AggregateException) /// - static member inline AwaitCancellableTask([] t: CancellableTask<'T>) = asyncEx { - let! ct = Async.CancellationToken - return! t ct - } + static member inline AwaitCancellableTask([] t: CancellableTask<'T>) = + asyncEx { + let! ct = Async.CancellationToken + return! t ct + } /// Return an asynchronous computation that will wait for the given task to complete and return /// its result. @@ -882,32 +883,35 @@ module CancellableTasks = /// /// This is based on Async.Await overload (esp. AwaitTask without throwing AggregateException) /// - static member inline AwaitCancellableTask([] t: CancellableTask) = asyncEx { - let! ct = Async.CancellationToken - return! t ct - } + static member inline AwaitCancellableTask([] t: CancellableTask) = + asyncEx { + let! ct = Async.CancellationToken + return! t ct + } type Microsoft.FSharp.Control.Async with /// Return an asynchronous computation that will wait for the given task to complete and return /// its result. - static member inline AwaitCancellableTask([] t: CancellableTask<'T>) = async { - let! ct = Async.CancellationToken + static member inline AwaitCancellableTask([] t: CancellableTask<'T>) = + async { + let! ct = Async.CancellationToken - return! - t ct - |> Async.AwaitTask - } + return! + t ct + |> Async.AwaitTask + } /// Return an asynchronous computation that will wait for the given task to complete and return /// its result. - static member inline AwaitCancellableTask([] t: CancellableTask) = async { - let! ct = Async.CancellationToken + static member inline AwaitCancellableTask([] t: CancellableTask) = + async { + let! ct = Async.CancellationToken - return! - t ct - |> Async.AwaitTask - } + return! + t ct + |> Async.AwaitTask + } /// Runs an asynchronous computation, starting on the current operating system thread. static member inline AsCancellableTask(computation: Async<'T>) : CancellableTask<_> = @@ -1124,16 +1128,17 @@ module CancellableTasks = /// A CancellableTask that represents the completion of all of the supplied tasks. /// The argument was . /// The collection contained a task. - let inline whenAll (tasks: CancellableTask<_> seq) = cancellableTask { - let! ct = getCancellationToken () + let inline whenAll (tasks: CancellableTask<_> seq) = + cancellableTask { + let! ct = getCancellationToken () - let! results = - tasks - |> Seq.map (fun t -> t ct) - |> Task.WhenAll + let! results = + tasks + |> Seq.map (fun t -> t ct) + |> Task.WhenAll - return results - } + return results + } /// Creates a task that will complete when all of the in an enumerable collection have completed. /// The tasks to wait on for completion @@ -1141,52 +1146,55 @@ module CancellableTasks = /// A CancellableTask that represents the completion of all of the supplied tasks. /// The argument was . /// The collection contained a task. - let inline whenAllThrottled (maxDegreeOfParallelism: int) (tasks: CancellableTask<_> seq) = cancellableTask { - let! ct = getCancellationToken () + let inline whenAllThrottled (maxDegreeOfParallelism: int) (tasks: CancellableTask<_> seq) = + cancellableTask { + let! ct = getCancellationToken () - use semaphore = - new SemaphoreSlim( - initialCount = maxDegreeOfParallelism, - maxCount = maxDegreeOfParallelism - ) + use semaphore = + new SemaphoreSlim( + initialCount = maxDegreeOfParallelism, + maxCount = maxDegreeOfParallelism + ) - let! results = - tasks - |> Seq.map (fun t -> task { - do! semaphore.WaitAsync ct + let! results = + tasks + |> Seq.map (fun t -> + task { + do! semaphore.WaitAsync ct - try - return! t ct - finally - semaphore.Release() - |> ignore + try + return! t ct + finally + semaphore.Release() + |> ignore - }) - |> Task.WhenAll + } + ) + |> Task.WhenAll - return results - } + return results + } /// Creates a that will complete when all of the s in an enumerable collection have completed sequentially. /// The tasks to wait on for completion /// A CancellableTask that represents the completion of all of the supplied tasks. - let inline sequential (tasks: CancellableTask<'a> seq) = cancellableTask { - let mutable results = ArrayCollector<'a>() + let inline sequential (tasks: CancellableTask<'a> seq) = + cancellableTask { + let mutable results = ArrayCollector<'a>() - for t in tasks do - let! result = t - results.Add result + for t in tasks do + let! result = t + results.Add result - return results.Close() - } + return results.Close() + } /// Coverts a CancellableTask to a CancellableTask\<unit\>. /// The CancellableTask to convert. /// a CancellableTask\<unit\>. - let inline ofUnit ([] unitCancellableTask: CancellableTask) = cancellableTask { - return! unitCancellableTask - } + let inline ofUnit ([] unitCancellableTask: CancellableTask) = + cancellableTask { return! unitCancellableTask } /// Coverts a CancellableTask\<_\> to a CancellableTask. /// The CancellableTask to convert. diff --git a/src/IcedTasks/CancellableValueTask.fs b/src/IcedTasks/CancellableValueTask.fs index 4802af7..7ce484e 100644 --- a/src/IcedTasks/CancellableValueTask.fs +++ b/src/IcedTasks/CancellableValueTask.fs @@ -1155,9 +1155,8 @@ module CancellableValueTasks = /// Coverts a CancellableValueTask to a CancellableValueTask\<unit\>. /// The CancellableValueTask to convert. /// a CancellableValueTask\<unit\>. - let inline ofUnit ([] unitCancellableTask: CancellableValueTask) = cancellableValueTask { - return! unitCancellableTask - } + let inline ofUnit ([] unitCancellableTask: CancellableValueTask) = + cancellableValueTask { return! unitCancellableTask } /// Coverts a CancellableValueTask\<_\> to a CancellableValueTask. /// The CancellableValueTask to convert. diff --git a/src/IcedTasks/ColdTask.fs b/src/IcedTasks/ColdTask.fs index 3f6b502..d0fc960 100644 --- a/src/IcedTasks/ColdTask.fs +++ b/src/IcedTasks/ColdTask.fs @@ -877,9 +877,8 @@ module ColdTasks = /// Coverts a ColdTask to a ColdTask\<unit\>. /// The ColdTask to convert. /// a ColdTask\<unit\>. - let inline ofUnit ([] unitColdTask: ColdTask) = coldTask { - return! unitColdTask - } + let inline ofUnit ([] unitColdTask: ColdTask) = + coldTask { return! unitColdTask } /// Coverts a ColdTask\<_\> to a ColdTask. /// The ColdTask to convert. diff --git a/src/IcedTasks/PoolingValueTasks.fs b/src/IcedTasks/PoolingValueTasks.fs index 39dd3b0..e1debca 100644 --- a/src/IcedTasks/PoolingValueTasks.fs +++ b/src/IcedTasks/PoolingValueTasks.fs @@ -713,30 +713,33 @@ module PoolingValueTasks = /// The continuation. /// The value. /// The result of the mapper wrapped in a PoolingValueTasks. - let inline map ([] mapper: 'input -> 'output) (cTask: ValueTask<'input>) = poolingValueTask { - let! cResult = cTask - return mapper cResult - } + let inline map ([] mapper: 'input -> 'output) (cTask: ValueTask<'input>) = + poolingValueTask { + let! cResult = cTask + return mapper cResult + } /// Allows chaining of PoolingValueTasks. /// A function wrapped in a PoolingValueTasks /// The value. /// The result of the applicable. - let inline apply (applicable: ValueTask<'input -> 'output>) (cTask: ValueTask<'input>) = poolingValueTask { - let! applier = applicable - let! cResult = cTask - return applier cResult - } + let inline apply (applicable: ValueTask<'input -> 'output>) (cTask: ValueTask<'input>) = + poolingValueTask { + let! applier = applicable + let! cResult = cTask + return applier cResult + } /// Takes two PoolingValueTasks, starts them serially in order of left to right, and returns a tuple of the pair. /// The left value. /// The right value. /// A tuple of the parameters passed in - let inline zip (left: ValueTask<'left>) (right: ValueTask<'right>) = poolingValueTask { - let! r1 = left - let! r2 = right - return r1, r2 - } + let inline zip (left: ValueTask<'left>) (right: ValueTask<'right>) = + poolingValueTask { + let! r1 = left + let! r2 = right + return r1, r2 + } let inline ofUnit (vtask: ValueTask) : ValueTask = // this implementation follows Stephen Toub's advice, see: diff --git a/src/IcedTasks/ValueTasks.fs b/src/IcedTasks/ValueTasks.fs index 04b1ad9..48aa466 100644 --- a/src/IcedTasks/ValueTasks.fs +++ b/src/IcedTasks/ValueTasks.fs @@ -768,30 +768,33 @@ module ValueTasks = /// The continuation. /// The value. /// The result of the mapper wrapped in a ValueTasks. - let inline map ([] mapper: 'input -> 'output) (cTask: ValueTask<'input>) = valueTask { - let! cResult = cTask - return mapper cResult - } + let inline map ([] mapper: 'input -> 'output) (cTask: ValueTask<'input>) = + valueTask { + let! cResult = cTask + return mapper cResult + } /// Allows chaining of ValueTasks. /// A function wrapped in a ValueTasks /// The value. /// The result of the applicable. - let inline apply (applicable: ValueTask<'input -> 'output>) (cTask: ValueTask<'input>) = valueTask { - let! applier = applicable - let! cResult = cTask - return applier cResult - } + let inline apply (applicable: ValueTask<'input -> 'output>) (cTask: ValueTask<'input>) = + valueTask { + let! applier = applicable + let! cResult = cTask + return applier cResult + } /// Takes two ValueTasks, starts them serially in order of left to right, and returns a tuple of the pair. /// The left value. /// The right value. /// A tuple of the parameters passed in - let inline zip (left: ValueTask<'left>) (right: ValueTask<'right>) = valueTask { - let! r1 = left - let! r2 = right - return r1, r2 - } + let inline zip (left: ValueTask<'left>) (right: ValueTask<'right>) = + valueTask { + let! r1 = left + let! r2 = right + return r1, r2 + } let inline ofUnit (vtask: ValueTask) : ValueTask = // this implementation follows Stephen Toub's advice, see: diff --git a/tests/IcedTasks.Tests/AsyncExTests.fs b/tests/IcedTasks.Tests/AsyncExTests.fs index 18842ed..6b05a1f 100644 --- a/tests/IcedTasks.Tests/AsyncExTests.fs +++ b/tests/IcedTasks.Tests/AsyncExTests.fs @@ -83,10 +83,11 @@ module AsyncExTests = let data = "foo" let inner = asyncEx { return data } - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result data "Should return the data" @@ -96,10 +97,11 @@ module AsyncExTests = let data = "foo" let inner = async { return data } - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result data "Should return the data" @@ -109,10 +111,11 @@ module AsyncExTests = let data = "foo" let inner = task { return data } - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result data "Should return the data" @@ -121,10 +124,11 @@ module AsyncExTests = <| async { let inner: Task = Task.CompletedTask - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result () "Should return the data" @@ -135,10 +139,11 @@ module AsyncExTests = let data = "foo" let inner = valueTask { return data } - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result data "Should return the data" @@ -147,10 +152,11 @@ module AsyncExTests = <| async { let inner: ValueTask = ValueTask.CompletedTask - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result () "Should return the data" @@ -160,10 +166,11 @@ module AsyncExTests = <| async { let inner = Task.Yield() - let outer = asyncEx { - let! result = inner - return result - } + let outer = + asyncEx { + let! result = inner + return result + } let! result = outer Expect.equal result () "Should return the data" @@ -175,14 +182,15 @@ module AsyncExTests = let data = "foo" let inner = asyncEx { return data } - let outer = asyncEx { - let! result = inner + let outer = + asyncEx { + let! result = inner - if true then - () + if true then + () - return result - } + return result + } let! result = outer Expect.equal result data "Should return the data" @@ -194,13 +202,14 @@ module AsyncExTests = let data = "foo" let inner = asyncEx { return data } - let outer = asyncEx { - try - let! result = inner - return result - with ex -> - return failwith "Should not throw" - } + let outer = + asyncEx { + try + let! result = inner + return result + with ex -> + return failwith "Should not throw" + } let! result = outer Expect.equal result data "Should return the data" @@ -210,27 +219,31 @@ module AsyncExTests = <| async { let data = "lol" - let inner = asyncEx { - let! result = task { - do! Task.Yield() - raise (ArgumentException "foo") - return data - } + let inner = + asyncEx { + let! result = + task { + do! Task.Yield() + raise (ArgumentException "foo") + return data + } - return result - } + return result + } - let outer = asyncEx { - try - let! result = inner - return () - with - | :? ArgumentException -> - // Should be this exception and not AggregationException - return () - | ex -> - return raise (Exception("Should not throw this type of exception", ex)) - } + let outer = + asyncEx { + try + let! result = inner + return () + with + | :? ArgumentException -> + // Should be this exception and not AggregationException + return () + | ex -> + return + raise (Exception("Should not throw this type of exception", ex)) + } let! result = outer Expect.equal result () "Should return the data" @@ -241,27 +254,30 @@ module AsyncExTests = <| async { let data = "lol" - let inner = asyncEx { - do! - task { - do! Task.Yield() - raise (ArgumentException "foo") - return data - } - :> Task - } - - let outer = asyncEx { - try - do! inner - return () - with - | :? ArgumentException -> - // Should be this exception and not AggregationException - return () - | ex -> - return raise (Exception("Should not throw this type of exception", ex)) - } + let inner = + asyncEx { + do! + task { + do! Task.Yield() + raise (ArgumentException "foo") + return data + } + :> Task + } + + let outer = + asyncEx { + try + do! inner + return () + with + | :? ArgumentException -> + // Should be this exception and not AggregationException + return () + | ex -> + return + raise (Exception("Should not throw this type of exception", ex)) + } let! result = outer Expect.equal result () "Should return the data" @@ -272,27 +288,31 @@ module AsyncExTests = <| async { let data = "lol" - let inner = asyncEx { - let! result = valueTask { - do! Task.Yield() - raise (ArgumentException "foo") - return data - } + let inner = + asyncEx { + let! result = + valueTask { + do! Task.Yield() + raise (ArgumentException "foo") + return data + } - return result - } + return result + } - let outer = asyncEx { - try - let! result = inner - return () - with - | :? ArgumentException -> - // Should be this exception and not AggregationException - return () - | ex -> - return raise (Exception("Should not throw this type of exception", ex)) - } + let outer = + asyncEx { + try + let! result = inner + return () + with + | :? ArgumentException -> + // Should be this exception and not AggregationException + return () + | ex -> + return + raise (Exception("Should not throw this type of exception", ex)) + } let! result = outer Expect.equal result () "Should return the data" @@ -303,35 +323,37 @@ module AsyncExTests = <| async { let data = "lol" - let inner = asyncEx { - let awaiter = - CustomAwaiter.CustomAwaiter( - (fun () -> raise (ArgumentException "foo")), - (fun () -> true) - ) + let inner = + asyncEx { + let awaiter = + CustomAwaiter.CustomAwaiter( + (fun () -> raise (ArgumentException "foo")), + (fun () -> true) + ) - let! result = awaiter + let! result = awaiter - return result - } + return result + } - let outer = asyncEx { - try - let! result = inner - return () - with - | :? ArgumentException -> - // Should be this exception and not AggregationException - return () - | ex -> - return - raise ( - Exception( - $"Should not throw this type of exception {ex.GetType()}", - ex + let outer = + asyncEx { + try + let! result = inner + return () + with + | :? ArgumentException -> + // Should be this exception and not AggregationException + return () + | ex -> + return + raise ( + Exception( + $"Should not throw this type of exception {ex.GetType()}", + ex + ) ) - ) - } + } let! result = outer Expect.equal result () "Should return the data" @@ -343,13 +365,14 @@ module AsyncExTests = let data = "foo" let inner = asyncEx { return data } - let outer = asyncEx { - try - let! result = inner - return result - finally - () - } + let outer = + asyncEx { + try + let! result = inner + return result + finally + () + } let! result = outer Expect.equal result data "Should return the data" @@ -362,10 +385,11 @@ module AsyncExTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = asyncEx { - use d = TestHelpers.makeDisposable (doDispose) - return data - } + let! actual = + asyncEx { + use d = TestHelpers.makeDisposable (doDispose) + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -376,13 +400,14 @@ module AsyncExTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = asyncEx { - use! d = - TestHelpers.makeDisposable (doDispose) - |> async.Return + let! actual = + asyncEx { + use! d = + TestHelpers.makeDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -397,10 +422,11 @@ module AsyncExTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = asyncEx { - use d = TestHelpers.makeAsyncDisposable (doDispose) - return data - } + let! actual = + asyncEx { + use d = TestHelpers.makeAsyncDisposable (doDispose) + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -415,13 +441,14 @@ module AsyncExTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = asyncEx { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + asyncEx { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -440,10 +467,11 @@ module AsyncExTests = } |> ValueTask - let! actual = asyncEx { - use d = TestHelpers.makeAsyncDisposable (doDispose) - return data - } + let! actual = + asyncEx { + use d = TestHelpers.makeAsyncDisposable (doDispose) + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -461,13 +489,14 @@ module AsyncExTests = } |> ValueTask - let! actual = asyncEx { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + asyncEx { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -477,10 +506,11 @@ module AsyncExTests = <| async { let data = 42 - let! actual = asyncEx { - use d = null - return data - } + let! actual = + asyncEx { + use d = null + return data + } Expect.equal actual data "Should be able to use use" } @@ -498,12 +528,13 @@ module AsyncExTests = <| async { let mutable index = 0 - let! actual = asyncEx { - while index < loops do - index <- index + 1 + let! actual = + asyncEx { + while index < loops do + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -521,13 +552,14 @@ module AsyncExTests = <| async { let mutable index = 0 - let! actual = asyncEx { - while index < loops do - do! Task.Yield() - index <- index + 1 + let! actual = + asyncEx { + while index < loops do + do! Task.Yield() + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -547,12 +579,13 @@ module AsyncExTests = <| async { let mutable index = 0 - let! actual = asyncEx { - for i in [ 1..10 ] do - index <- i + i + let! actual = + asyncEx { + for i in [ 1..10 ] do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -570,12 +603,13 @@ module AsyncExTests = <| async { let mutable index = 0 - let! actual = asyncEx { - for i = 1 to loops do - index <- i + i + let! actual = + asyncEx { + for i = 1 to loops do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -592,13 +626,14 @@ module AsyncExTests = <| async { let mutable index = 0 - let! actual = asyncEx { - for i in [ 1..10 ] do - do! Task.Yield() - index <- i + i + let! actual = + asyncEx { + for i in [ 1..10 ] do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -616,13 +651,14 @@ module AsyncExTests = <| async { let mutable index = 0 - let! actual = asyncEx { - for i = 1 to loops do - do! Task.Yield() - index <- i + i + let! actual = + asyncEx { + for i = 1 to loops do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } diff --git a/tests/IcedTasks.Tests/CancellableTaskTests.fs b/tests/IcedTasks.Tests/CancellableTaskTests.fs index 42ea8ba..b834a67 100644 --- a/tests/IcedTasks.Tests/CancellableTaskTests.fs +++ b/tests/IcedTasks.Tests/CancellableTaskTests.fs @@ -168,10 +168,11 @@ module CancellableTaskTests = let expected = "lol" let fooTask: CancellableTask<_> = fun ct -> Task.FromResult expected - let outerTask = cancellableTask { - let! result = fooTask - return result - } + let outerTask = + cancellableTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -186,10 +187,11 @@ module CancellableTaskTests = <| async { let fooTask = fun (ct: CancellationToken) -> Task.Yield() - let outerTask = cancellableValueTask { - let! result = fooTask - return result - } + let outerTask = + cancellableValueTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -214,10 +216,11 @@ module CancellableTaskTests = <| async { let expected = "lol" - let outerTask = cancellableTask { - let! result = Task.FromResult expected - return result - } + let outerTask = + cancellableTask { + let! result = Task.FromResult expected + return result + } use cts = new CancellationTokenSource() @@ -234,10 +237,11 @@ module CancellableTaskTests = let coldT = coldTask { return expected } - let outerTask = cancellableTask { - let! result = coldT - return result - } + let outerTask = + cancellableTask { + let! result = coldT + return result + } use cts = new CancellationTokenSource() @@ -253,10 +257,11 @@ module CancellableTaskTests = let coldT: ColdTask = fun () -> Task.CompletedTask - let outerTask = cancellableTask { - let! result = coldT - return result - } + let outerTask = + cancellableTask { + let! result = coldT + return result + } use cts = new CancellationTokenSource() @@ -270,10 +275,11 @@ module CancellableTaskTests = <| async { let fooTask = fun () -> Task.Yield() - let outerTask = cancellableTask { - let! result = fooTask - return result - } + let outerTask = + cancellableTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -288,10 +294,11 @@ module CancellableTaskTests = let expected = "lol" let fooTask = async.Return expected - let outerTask = cancellableTask { - let! result = fooTask - return result - } + let outerTask = + cancellableTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -309,14 +316,15 @@ module CancellableTaskTests = <| async { let data = 42 - let! actual = cancellableTask { - let result = data + let! actual = + cancellableTask { + let result = data - if true then - () + if true then + () - return result - } + return result + } Expect.equal actual data "Zero/Combine/Delay should work" } @@ -327,16 +335,17 @@ module CancellableTaskTests = <| async { let data = 42 - let! actual = cancellableTask { - let data = data + let! actual = + cancellableTask { + let data = data - try - () - with _ -> - () + try + () + with _ -> + () - return data - } + return data + } Expect.equal actual data "TryWith should work" } @@ -347,16 +356,17 @@ module CancellableTaskTests = <| async { let data = 42 - let! actual = cancellableTask { - let data = data + let! actual = + cancellableTask { + let data = data - try - () - finally - () + try + () + finally + () - return data - } + return data + } Expect.equal actual data "TryFinally should work" } @@ -369,10 +379,11 @@ module CancellableTaskTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = cancellableTask { - use d = TestHelpers.makeDisposable (doDispose) - return data - } + let! actual = + cancellableTask { + use d = TestHelpers.makeDisposable (doDispose) + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -383,13 +394,14 @@ module CancellableTaskTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = cancellableTask { - use! d = - TestHelpers.makeDisposable (doDispose) - |> async.Return + let! actual = + cancellableTask { + use! d = + TestHelpers.makeDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -406,11 +418,12 @@ module CancellableTaskTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = cancellableTask { - use d = TestHelpers.makeAsyncDisposable (doDispose) + let! actual = + cancellableTask { + use d = TestHelpers.makeAsyncDisposable (doDispose) - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -424,13 +437,14 @@ module CancellableTaskTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = cancellableTask { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + cancellableTask { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -451,12 +465,13 @@ module CancellableTaskTests = |> ValueTask - let! actual = cancellableTask { - use d = TestHelpers.makeAsyncDisposable (doDispose) - Expect.isFalse wasDisposed "" + let! actual = + cancellableTask { + use d = TestHelpers.makeAsyncDisposable (doDispose) + Expect.isFalse wasDisposed "" - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -475,15 +490,16 @@ module CancellableTaskTests = |> ValueTask - let! actual = cancellableTask { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + cancellableTask { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - Expect.isFalse wasDisposed "" + Expect.isFalse wasDisposed "" - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -493,10 +509,11 @@ module CancellableTaskTests = <| async { let data = 42 - let! actual = cancellableTask { - use d = null - return data - } + let! actual = + cancellableTask { + use d = null + return data + } Expect.equal actual data "Should be able to use use" } @@ -514,12 +531,13 @@ module CancellableTaskTests = <| async { let mutable index = 0 - let! actual = cancellableTask { - while index < loops do - index <- index + 1 + let! actual = + cancellableTask { + while index < loops do + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -537,13 +555,14 @@ module CancellableTaskTests = <| async { let mutable index = 0 - let! actual = cancellableTask { - while index < loops do - do! Task.Yield() - index <- index + 1 + let! actual = + cancellableTask { + while index < loops do + do! Task.Yield() + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -564,12 +583,13 @@ module CancellableTaskTests = <| async { let mutable index = 0 - let! actual = cancellableTask { - for i in [ 1..10 ] do - index <- i + i + let! actual = + cancellableTask { + for i in [ 1..10 ] do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -587,12 +607,13 @@ module CancellableTaskTests = <| async { let mutable index = 0 - let! actual = cancellableTask { - for i = 1 to loops do - index <- i + i + let! actual = + cancellableTask { + for i = 1 to loops do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -609,13 +630,14 @@ module CancellableTaskTests = <| async { let mutable index = 0 - let! actual = cancellableTask { - for i in [ 1..10 ] do - do! Task.Yield() - index <- i + i + let! actual = + cancellableTask { + for i in [ 1..10 ] do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -633,13 +655,14 @@ module CancellableTaskTests = <| async { let mutable index = 0 - let! actual = cancellableTask { - for i = 1 to loops do - do! Task.Yield() - index <- i + i + let! actual = + cancellableTask { + for i = 1 to loops do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -650,14 +673,15 @@ module CancellableTaskTests = testList "MergeSources" [ testCaseAsync "and! 6" <| async { - let! actual = cancellableTask { - let! a = cancellableTask { return 1 } - and! b = coldTask { return 2 } - and! _ = Task.Yield() - and! _ = ValueTask.CompletedTask - and! c = fun () -> ValueTask.FromResult(3) - return a + b + c - } + let! actual = + cancellableTask { + let! a = cancellableTask { return 1 } + and! b = coldTask { return 2 } + and! _ = Task.Yield() + and! _ = ValueTask.CompletedTask + and! c = fun () -> ValueTask.FromResult(3) + return a + b + c + } Expect.equal actual 6 "" @@ -710,10 +734,11 @@ module CancellableTaskTests = testCaseAsync "Can extract context's CancellationToken via CancellableTask.getCancellationToken" <| async { - let fooTask = cancellableTask { - let! ct = CancellableTask.getCancellationToken () - return ct - } + let fooTask = + cancellableTask { + let! ct = CancellableTask.getCancellationToken () + return ct + } use cts = new CancellationTokenSource() @@ -732,19 +757,23 @@ module CancellableTaskTests = do! Expect.CancellationRequested( cancellableTask { - let fooTask = cancellableTask { - return! cancellableTask { - do! cancellableTask { - let! ct = CancellableTask.getCancellationToken () - - do! - timeProvider.Delay( - TimeSpan.FromMilliseconds(1000), - ct - ) - } + let fooTask = + cancellableTask { + return! + cancellableTask { + do! + cancellableTask { + let! ct = + CancellableTask.getCancellationToken () + + do! + timeProvider.Delay( + TimeSpan.FromMilliseconds(1000), + ct + ) + } + } } - } use cts = timeProvider.CreateCancellationTokenSource( @@ -764,14 +793,16 @@ module CancellableTaskTests = testCaseAsync "pass along CancellationToken to async bind" <| async { - let fooTask = cancellableTask { - let! result = async { - let! ct = Async.CancellationToken - return ct - } + let fooTask = + cancellableTask { + let! result = + async { + let! ct = Async.CancellationToken + return ct + } - return result - } + return result + } use cts = new CancellationTokenSource() @@ -786,15 +817,15 @@ module CancellableTaskTests = testCase "CancellationToken flows from Async to CancellableTask via Async.AwaitCancellableTask" <| fun () -> - let innerTask = cancellableTask { - return! CancellableTask.getCancellationToken () - } - - let outerAsync = async { - return! - innerTask - |> Async.AwaitCancellableTask - } + let innerTask = + cancellableTask { return! CancellableTask.getCancellationToken () } + + let outerAsync = + async { + return! + innerTask + |> Async.AwaitCancellableTask + } use cts = new CancellationTokenSource() let actual = Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -806,11 +837,12 @@ module CancellableTaskTests = let mutable actual = CancellationToken.None let innerTask: CancellableTask = fun ct -> task { actual <- ct } :> Task - let outerAsync = async { - return! - innerTask - |> Async.AwaitCancellableTask - } + let outerAsync = + async { + return! + innerTask + |> Async.AwaitCancellableTask + } use cts = new CancellationTokenSource() Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -828,10 +860,11 @@ module CancellableTaskTests = <| fun () -> let innerTask = cancellableTask { return! CancellableTask.getCancellationToken () } - let outerAsync = async { - let! result = innerTask - return result - } + let outerAsync = + async { + let! result = innerTask + return result + } use cts = new CancellationTokenSource() let actual = Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -877,10 +910,11 @@ module CancellableTaskTests = <| fun () -> let innerTask = cancellableTask { return! CancellableTask.getCancellationToken () } - let outerAsync = asyncEx { - let! result = innerTask - return result - } + let outerAsync = + asyncEx { + let! result = innerTask + return result + } use cts = new CancellationTokenSource() let actual = Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -1033,14 +1067,16 @@ module CancellableTaskTests = let tasks = items - |> List.map (fun i -> cancellableTask { - do! fun ct -> timeProvider.Delay(TimeSpan.FromSeconds(15.), ct) + |> List.map (fun i -> + cancellableTask { + do! fun ct -> timeProvider.Delay(TimeSpan.FromSeconds(15.), ct) - times.TryAdd(i, timeProvider.GetUtcNow()) - |> ignore + times.TryAdd(i, timeProvider.GetUtcNow()) + |> ignore - return i + 1 - }) + return i + 1 + } + ) let! ct = Async.CancellationToken let result = CancellableTask.whenAll tasks ct @@ -1079,14 +1115,16 @@ module CancellableTaskTests = let tasks = items - |> List.map (fun i -> cancellableTask { - do! fun ct -> timeProvider.Delay(pauseTimeTS, ct) + |> List.map (fun i -> + cancellableTask { + do! fun ct -> timeProvider.Delay(pauseTimeTS, ct) - times.TryAdd(i, timeProvider.GetUtcNow()) - |> ignore + times.TryAdd(i, timeProvider.GetUtcNow()) + |> ignore - return i + 1 - }) + return i + 1 + } + ) let! ct = Async.CancellationToken let result = CancellableTask.whenAllThrottled maxDegreeOfParallelism tasks ct @@ -1140,14 +1178,16 @@ module CancellableTaskTests = let tasks = items - |> List.map (fun i -> cancellableTask { - do! fun ct -> timeProvider.Delay(pauseTimeTS, ct) + |> List.map (fun i -> + cancellableTask { + do! fun ct -> timeProvider.Delay(pauseTimeTS, ct) - times.TryAdd(i, timeProvider.GetUtcNow()) - |> ignore + times.TryAdd(i, timeProvider.GetUtcNow()) + |> ignore - return i + 1 - }) + return i + 1 + } + ) let! ct = Async.CancellationToken let result = CancellableTask.sequential tasks ct diff --git a/tests/IcedTasks.Tests/CancellableValueTaskTests.fs b/tests/IcedTasks.Tests/CancellableValueTaskTests.fs index 3125347..177c9c9 100644 --- a/tests/IcedTasks.Tests/CancellableValueTaskTests.fs +++ b/tests/IcedTasks.Tests/CancellableValueTaskTests.fs @@ -177,10 +177,11 @@ module CancellableValueTaskTests = let expected = "lol" let fooTask: CancellableValueTask<_> = fun ct -> ValueTask.FromResult expected - let outerTask = cancellableValueTask { - let! result = fooTask - return result - } + let outerTask = + cancellableValueTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -207,10 +208,11 @@ module CancellableValueTaskTests = let expected = "lol" let fooTask: CancellableTask<_> = fun ct -> Task.FromResult expected - let outerTask = cancellableValueTask { - let! result = fooTask - return result - } + let outerTask = + cancellableValueTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -225,10 +227,11 @@ module CancellableValueTaskTests = <| async { let fooTask = fun (ct: CancellationToken) -> Task.Yield() - let outerTask = cancellableValueTask { - let! result = fooTask - return result - } + let outerTask = + cancellableValueTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -253,10 +256,11 @@ module CancellableValueTaskTests = <| async { let expected = "lol" - let outerTask = cancellableValueTask { - let! result = Task.FromResult expected - return result - } + let outerTask = + cancellableValueTask { + let! result = Task.FromResult expected + return result + } use cts = new CancellationTokenSource() @@ -273,10 +277,11 @@ module CancellableValueTaskTests = let coldT = coldTask { return expected } - let outerTask = cancellableValueTask { - let! result = coldT - return result - } + let outerTask = + cancellableValueTask { + let! result = coldT + return result + } use cts = new CancellationTokenSource() @@ -292,10 +297,11 @@ module CancellableValueTaskTests = let coldT: ColdTask = fun () -> Task.CompletedTask - let outerTask = cancellableValueTask { - let! result = coldT - return result - } + let outerTask = + cancellableValueTask { + let! result = coldT + return result + } use cts = new CancellationTokenSource() @@ -309,10 +315,11 @@ module CancellableValueTaskTests = <| async { let fooTask = fun () -> Task.Yield() - let outerTask = cancellableValueTask { - let! result = fooTask - return result - } + let outerTask = + cancellableValueTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -327,10 +334,11 @@ module CancellableValueTaskTests = let expected = "lol" let fooTask = async.Return expected - let outerTask = cancellableValueTask { - let! result = fooTask - return result - } + let outerTask = + cancellableValueTask { + let! result = fooTask + return result + } use cts = new CancellationTokenSource() @@ -348,14 +356,15 @@ module CancellableValueTaskTests = <| async { let data = 42 - let! actual = cancellableValueTask { - let result = data + let! actual = + cancellableValueTask { + let result = data - if true then - () + if true then + () - return result - } + return result + } Expect.equal actual data "Zero/Combine/Delay should work" } @@ -366,16 +375,17 @@ module CancellableValueTaskTests = <| async { let data = 42 - let! actual = cancellableValueTask { - let data = data + let! actual = + cancellableValueTask { + let data = data - try - () - with _ -> - () + try + () + with _ -> + () - return data - } + return data + } Expect.equal actual data "TryWith should work" } @@ -386,16 +396,17 @@ module CancellableValueTaskTests = <| async { let data = 42 - let! actual = cancellableValueTask { - let data = data + let! actual = + cancellableValueTask { + let data = data - try - () - finally - () + try + () + finally + () - return data - } + return data + } Expect.equal actual data "TryFinally should work" } @@ -408,10 +419,11 @@ module CancellableValueTaskTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = cancellableValueTask { - use d = TestHelpers.makeDisposable doDispose - return data - } + let! actual = + cancellableValueTask { + use d = TestHelpers.makeDisposable doDispose + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -422,13 +434,14 @@ module CancellableValueTaskTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = cancellableValueTask { - use! d = - TestHelpers.makeDisposable doDispose - |> async.Return + let! actual = + cancellableValueTask { + use! d = + TestHelpers.makeDisposable doDispose + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -443,11 +456,12 @@ module CancellableValueTaskTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = cancellableValueTask { - use d = TestHelpers.makeAsyncDisposable (doDispose) + let! actual = + cancellableValueTask { + use d = TestHelpers.makeAsyncDisposable (doDispose) - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -461,13 +475,14 @@ module CancellableValueTaskTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = cancellableValueTask { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + cancellableValueTask { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -487,12 +502,13 @@ module CancellableValueTaskTests = } |> ValueTask - let! actual = cancellableValueTask { - use d = TestHelpers.makeAsyncDisposable (doDispose) - Expect.isFalse wasDisposed "" + let! actual = + cancellableValueTask { + use d = TestHelpers.makeAsyncDisposable (doDispose) + Expect.isFalse wasDisposed "" - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -510,14 +526,15 @@ module CancellableValueTaskTests = } |> ValueTask - let! actual = cancellableValueTask { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + cancellableValueTask { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - Expect.isFalse wasDisposed "" - return data - } + Expect.isFalse wasDisposed "" + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -527,10 +544,11 @@ module CancellableValueTaskTests = <| async { let data = 42 - let! actual = cancellableValueTask { - use d = null - return data - } + let! actual = + cancellableValueTask { + use d = null + return data + } Expect.equal actual data "Should be able to use use" } @@ -549,12 +567,13 @@ module CancellableValueTaskTests = <| async { let mutable index = 0 - let! actual = cancellableValueTask { - while index < loops do - index <- index + 1 + let! actual = + cancellableValueTask { + while index < loops do + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -572,13 +591,14 @@ module CancellableValueTaskTests = <| async { let mutable index = 0 - let! actual = cancellableValueTask { - while index < loops do - do! Task.Yield() - index <- index + 1 + let! actual = + cancellableValueTask { + while index < loops do + do! Task.Yield() + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -599,12 +619,13 @@ module CancellableValueTaskTests = <| async { let mutable index = 0 - let! actual = cancellableValueTask { - for i in [ 1..10 ] do - index <- i + i + let! actual = + cancellableValueTask { + for i in [ 1..10 ] do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -622,12 +643,13 @@ module CancellableValueTaskTests = <| async { let mutable index = 0 - let! actual = cancellableValueTask { - for i = 1 to loops do - index <- i + i + let! actual = + cancellableValueTask { + for i = 1 to loops do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -644,13 +666,14 @@ module CancellableValueTaskTests = <| async { let mutable index = 0 - let! actual = cancellableValueTask { - for i in [ 1..10 ] do - do! Task.Yield() - index <- i + i + let! actual = + cancellableValueTask { + for i in [ 1..10 ] do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -668,13 +691,14 @@ module CancellableValueTaskTests = <| async { let mutable index = 0 - let! actual = cancellableValueTask { - for i = 1 to loops do - do! Task.Yield() - index <- i + i + let! actual = + cancellableValueTask { + for i = 1 to loops do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -684,14 +708,15 @@ module CancellableValueTaskTests = testList "MergeSources" [ testCaseAsync "and! 6" <| async { - let! actual = cancellableValueTask { - let! a = cancellableValueTask { return 1 } - and! b = coldTask { return 2 } - and! _ = Task.Yield() - and! _ = ValueTask.CompletedTask - and! c = fun () -> ValueTask.FromResult(3) - return a + b + c - } + let! actual = + cancellableValueTask { + let! a = cancellableValueTask { return 1 } + and! b = coldTask { return 2 } + and! _ = Task.Yield() + and! _ = ValueTask.CompletedTask + and! c = fun () -> ValueTask.FromResult(3) + return a + b + c + } Expect.equal actual 6 "" @@ -744,10 +769,11 @@ module CancellableValueTaskTests = testCaseAsync "Can extract context's CancellationToken via CancellableValueTask.getCancellationToken" <| async { - let fooTask = cancellableValueTask { - let! ct = CancellableValueTask.getCancellationToken () - return ct - } + let fooTask = + cancellableValueTask { + let! ct = CancellableValueTask.getCancellationToken () + return ct + } use cts = new CancellationTokenSource() @@ -766,19 +792,24 @@ module CancellableValueTaskTests = do! Expect.CancellationRequested( cancellableValueTask { - let fooTask = cancellableValueTask { - return! cancellableValueTask { - do! cancellableValueTask { - let! ct = CancellableValueTask.getCancellationToken () - - do! - timeProvider.Delay( - TimeSpan.FromMilliseconds(1000), - ct - ) - } + let fooTask = + cancellableValueTask { + return! + cancellableValueTask { + do! + cancellableValueTask { + let! ct = + CancellableValueTask.getCancellationToken + () + + do! + timeProvider.Delay( + TimeSpan.FromMilliseconds(1000), + ct + ) + } + } } - } use cts = timeProvider.CreateCancellationTokenSource( @@ -798,14 +829,16 @@ module CancellableValueTaskTests = testCaseAsync "pass along CancellationToken to async bind" <| async { - let fooTask = cancellableValueTask { - let! result = async { - let! ct = Async.CancellationToken - return ct - } + let fooTask = + cancellableValueTask { + let! result = + async { + let! ct = Async.CancellationToken + return ct + } - return result - } + return result + } use cts = new CancellationTokenSource() @@ -819,15 +852,17 @@ module CancellableValueTaskTests = testCase "CancellationToken flows from Async to CancellableValueTask via Async.AwaitCancellableValueTask" <| fun () -> - let innerTask = cancellableValueTask { - return! CancellableValueTask.getCancellationToken () - } + let innerTask = + cancellableValueTask { + return! CancellableValueTask.getCancellationToken () + } - let outerAsync = async { - return! - innerTask - |> Async.AwaitCancellableValueTask - } + let outerAsync = + async { + return! + innerTask + |> Async.AwaitCancellableValueTask + } use cts = new CancellationTokenSource() let actual = Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -843,11 +878,12 @@ module CancellableValueTaskTests = valueTask { actual <- ct } |> ValueTask.toUnit - let outerAsync = async { - return! - innerTask - |> Async.AwaitCancellableValueTask - } + let outerAsync = + async { + return! + innerTask + |> Async.AwaitCancellableValueTask + } use cts = new CancellationTokenSource() Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -860,14 +896,14 @@ module CancellableValueTaskTests = testCase "AsyncBuilder can Bind CancellableValueTask" <| fun () -> - let innerTask = cancellableValueTask { - return! CancellableValueTask.getCancellationToken () - } + let innerTask = + cancellableValueTask { return! CancellableValueTask.getCancellationToken () } - let outerAsync = async { - let! result = innerTask - return result - } + let outerAsync = + async { + let! result = innerTask + return result + } use cts = new CancellationTokenSource() let actual = Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -876,9 +912,8 @@ module CancellableValueTaskTests = testCase "AsyncBuilder can ReturnFrom CancellableValueTask" <| fun () -> - let innerTask = cancellableValueTask { - return! CancellableValueTask.getCancellationToken () - } + let innerTask = + cancellableValueTask { return! CancellableValueTask.getCancellationToken () } let outerAsync = async { return! innerTask } @@ -924,14 +959,14 @@ module CancellableValueTaskTests = testCase "AsyncExBuilder can Bind CancellableValueTask" <| fun () -> - let innerTask = cancellableValueTask { - return! CancellableValueTask.getCancellationToken () - } + let innerTask = + cancellableValueTask { return! CancellableValueTask.getCancellationToken () } - let outerAsync = asyncEx { - let! result = innerTask - return result - } + let outerAsync = + asyncEx { + let! result = innerTask + return result + } use cts = new CancellationTokenSource() let actual = Async.RunSynchronously(outerAsync, cancellationToken = cts.Token) @@ -940,9 +975,8 @@ module CancellableValueTaskTests = testCase "AsyncBuilder can ReturnFrom CancellableValueTask" <| fun () -> - let innerTask = cancellableValueTask { - return! CancellableValueTask.getCancellationToken () - } + let innerTask = + cancellableValueTask { return! CancellableValueTask.getCancellationToken () } let outerAsync = asyncEx { return! innerTask } @@ -1001,9 +1035,9 @@ module CancellableValueTaskTests = let! someTask = innerCall - |> CancellableValueTask.bind (fun x -> cancellableValueTask { - return x + "fooo" - }) + |> CancellableValueTask.bind (fun x -> + cancellableValueTask { return x + "fooo" } + ) Expect.equal "lolfooo" someTask "" } diff --git a/tests/IcedTasks.Tests/ColdTaskTests.fs b/tests/IcedTasks.Tests/ColdTaskTests.fs index f143fd8..16435f2 100644 --- a/tests/IcedTasks.Tests/ColdTaskTests.fs +++ b/tests/IcedTasks.Tests/ColdTaskTests.fs @@ -6,10 +6,11 @@ open System.Threading.Tasks open IcedTasks module ColdTaskHelpers = - let map (mapper: 'a -> 'b) (item: ColdTask<'a>) : ColdTask<'b> = coldTask { - let! i = item - return mapper i - } + let map (mapper: 'a -> 'b) (item: ColdTask<'a>) : ColdTask<'b> = + coldTask { + let! i = item + return mapper i + } module ColdTaskTests = open System.Threading @@ -178,10 +179,11 @@ module ColdTaskTests = let expected = "lol" let fooTask: ColdTask<_> = fun () -> Task.FromResult expected - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } let! actual = outerTask () @@ -203,10 +205,11 @@ module ColdTaskTests = <| async { let expected = "lol" - let outerTask = coldTask { - let! result = Task.FromResult expected - return result - } + let outerTask = + coldTask { + let! result = Task.FromResult expected + return result + } let! actual = outerTask () @@ -220,10 +223,11 @@ module ColdTaskTests = <| async { let fooTask = ValueTask.CompletedTask - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } do! outerTask () @@ -236,10 +240,11 @@ module ColdTaskTests = let expected = "lol" let fooTask = ValueTask.FromResult expected - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } let! actual = outerTask () @@ -253,10 +258,11 @@ module ColdTaskTests = <| async { let fooTask = fun () -> ValueTask.CompletedTask - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } do! outerTask () @@ -269,10 +275,11 @@ module ColdTaskTests = let expected = "lol" let fooTask = fun () -> ValueTask.FromResult expected - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } let! actual = outerTask () @@ -285,10 +292,11 @@ module ColdTaskTests = <| async { let fooTask = fun () -> Task.Yield() - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } do! outerTask () @@ -301,10 +309,11 @@ module ColdTaskTests = let expected = "lol" let fooTask = async.Return expected - let outerTask = coldTask { - let! result = fooTask - return result - } + let outerTask = + coldTask { + let! result = fooTask + return result + } let! actual = outerTask () @@ -320,14 +329,15 @@ module ColdTaskTests = <| async { let data = 42 - let! actual = coldTask { - let result = data + let! actual = + coldTask { + let result = data - if true then - () + if true then + () - return result - } + return result + } Expect.equal actual data "Zero/Combine/Delay should work" } @@ -338,16 +348,17 @@ module ColdTaskTests = <| async { let data = 42 - let! actual = coldTask { - let data = data + let! actual = + coldTask { + let data = data - try - () - with _ -> - () + try + () + with _ -> + () - return data - } + return data + } Expect.equal actual data "TryWith should work" } @@ -358,16 +369,17 @@ module ColdTaskTests = <| async { let data = 42 - let! actual = coldTask { - let data = data + let! actual = + coldTask { + let data = data - try - () - finally - () + try + () + finally + () - return data - } + return data + } Expect.equal actual data "TryFinally should work" } @@ -380,10 +392,11 @@ module ColdTaskTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = coldTask { - use d = TestHelpers.makeDisposable (doDispose) - return data - } + let! actual = + coldTask { + use d = TestHelpers.makeDisposable (doDispose) + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -394,13 +407,14 @@ module ColdTaskTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = coldTask { - use! d = - TestHelpers.makeDisposable (doDispose) - |> async.Return + let! actual = + coldTask { + use! d = + TestHelpers.makeDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -417,11 +431,12 @@ module ColdTaskTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = coldTask { - use d = TestHelpers.makeAsyncDisposable (doDispose) + let! actual = + coldTask { + use d = TestHelpers.makeAsyncDisposable (doDispose) - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -435,13 +450,14 @@ module ColdTaskTests = wasDisposed <- true ValueTask.CompletedTask - let! actual = coldTask { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + coldTask { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -462,12 +478,13 @@ module ColdTaskTests = |> ValueTask - let! actual = coldTask { - use d = TestHelpers.makeAsyncDisposable (doDispose) - Expect.isFalse wasDisposed "" + let! actual = + coldTask { + use d = TestHelpers.makeAsyncDisposable (doDispose) + Expect.isFalse wasDisposed "" - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -486,15 +503,16 @@ module ColdTaskTests = |> ValueTask - let! actual = coldTask { - use! d = - TestHelpers.makeAsyncDisposable (doDispose) - |> async.Return + let! actual = + coldTask { + use! d = + TestHelpers.makeAsyncDisposable (doDispose) + |> async.Return - Expect.isFalse wasDisposed "" + Expect.isFalse wasDisposed "" - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -504,10 +522,11 @@ module ColdTaskTests = <| async { let data = 42 - let! actual = coldTask { - use d = null - return data - } + let! actual = + coldTask { + use d = null + return data + } Expect.equal actual data "Should be able to use use" } @@ -526,12 +545,13 @@ module ColdTaskTests = <| async { let mutable index = 0 - let! actual = coldTask { - while index < loops do - index <- index + 1 + let! actual = + coldTask { + while index < loops do + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -549,13 +569,14 @@ module ColdTaskTests = <| async { let mutable index = 0 - let! actual = coldTask { - while index < loops do - do! Task.Yield() - index <- index + 1 + let! actual = + coldTask { + while index < loops do + do! Task.Yield() + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -575,12 +596,13 @@ module ColdTaskTests = <| async { let mutable index = 0 - let! actual = coldTask { - for i in [ 1..10 ] do - index <- i + i + let! actual = + coldTask { + for i in [ 1..10 ] do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -598,12 +620,13 @@ module ColdTaskTests = <| async { let mutable index = 0 - let! actual = coldTask { - for i = 1 to loops do - index <- i + i + let! actual = + coldTask { + for i = 1 to loops do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -620,13 +643,14 @@ module ColdTaskTests = <| async { let mutable index = 0 - let! actual = coldTask { - for i in [ 1..10 ] do - do! Task.Yield() - index <- i + i + let! actual = + coldTask { + for i in [ 1..10 ] do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -644,13 +668,14 @@ module ColdTaskTests = <| async { let mutable index = 0 - let! actual = coldTask { - for i = 1 to loops do - do! Task.Yield() - index <- i + i + let! actual = + coldTask { + for i = 1 to loops do + do! Task.Yield() + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -660,14 +685,15 @@ module ColdTaskTests = testList "MergeSources" [ testCaseAsync "and! 5" <| async { - let! actual = coldTask { - let! a = fun () -> Task.FromResult 1 - and! b = coldTask { return 2 } - and! _ = Task.Yield() - and! _ = ValueTask.CompletedTask - and! c = fun () -> ValueTask.FromResult(3) - return a + b + c - } + let! actual = + coldTask { + let! a = fun () -> Task.FromResult 1 + and! b = coldTask { return 2 } + and! _ = Task.Yield() + and! _ = ValueTask.CompletedTask + and! c = fun () -> ValueTask.FromResult(3) + return a + b + c + } Expect.equal actual 6 "" @@ -775,10 +801,11 @@ module ColdTaskTests = <| fun () -> let innerTask = coldTask { return! coldTask { return "lol" } } - let outerAsync = async { - let! result = innerTask - return result - } + let outerAsync = + async { + let! result = innerTask + return result + } let actual = Async.RunSynchronously(outerAsync) Expect.equal actual "lol" "" @@ -797,10 +824,11 @@ module ColdTaskTests = <| fun () -> let innerTask: ColdTask = fun () -> Task.CompletedTask - let outerAsync = async { - let! result = innerTask - return result - } + let outerAsync = + async { + let! result = innerTask + return result + } let actual = Async.RunSynchronously(outerAsync) Expect.equal actual () "" @@ -823,10 +851,11 @@ module ColdTaskTests = <| fun () -> let innerTask = coldTask { return! coldTask { return "lol" } } - let outerAsync = asyncEx { - let! result = innerTask - return result - } + let outerAsync = + asyncEx { + let! result = innerTask + return result + } let actual = Async.RunSynchronously(outerAsync) Expect.equal actual "lol" "" @@ -845,10 +874,11 @@ module ColdTaskTests = <| fun () -> let innerTask: ColdTask = fun () -> Task.CompletedTask - let outerAsync = asyncEx { - let! result = innerTask - return result - } + let outerAsync = + asyncEx { + let! result = innerTask + return result + } let actual = Async.RunSynchronously(outerAsync) Expect.equal actual () "" @@ -871,10 +901,11 @@ module ColdTaskTests = <| fun () -> let innerTask = coldTask { return! coldTask { return "lol" } } - let outerAsync = task { - let! result = innerTask - return result - } + let outerAsync = + task { + let! result = innerTask + return result + } let actual = outerAsync.GetAwaiter().GetResult() Expect.equal actual "lol" "" @@ -893,10 +924,11 @@ module ColdTaskTests = <| fun () -> let innerTask: ColdTask = fun () -> Task.CompletedTask - let outerAsync = task { - let! result = innerTask - return result - } + let outerAsync = + task { + let! result = innerTask + return result + } let actual = outerAsync.GetAwaiter().GetResult() Expect.equal actual () "" diff --git a/tests/IcedTasks.Tests/Expect.fs b/tests/IcedTasks.Tests/Expect.fs index f342f62..a423961 100644 --- a/tests/IcedTasks.Tests/Expect.fs +++ b/tests/IcedTasks.Tests/Expect.fs @@ -20,26 +20,28 @@ module Expect = /// Expects the passed function to throw `'texn`. [] - let throwsTAsync<'texn when 'texn :> exn> f message = async { - let! thrown = async { - try - do! f () - return ValueNone - with e -> - return ValueSome e + let throwsTAsync<'texn when 'texn :> exn> f message = + async { + let! thrown = + async { + try + do! f () + return ValueNone + with e -> + return ValueSome e + } + + match thrown with + | ValueSome e when e.GetType().IsAssignableFrom typeof<'texn> -> + failtestf + "%s. Expected f to throw an exn of type %s, but one of type %s was thrown." + message + (typeof<'texn>.FullName) + (e.GetType().FullName) + | ValueSome _ -> () + | _ -> failtestf "%s. Expected f to throw." message } - match thrown with - | ValueSome e when e.GetType().IsAssignableFrom typeof<'texn> -> - failtestf - "%s. Expected f to throw an exn of type %s, but one of type %s was thrown." - message - (typeof<'texn>.FullName) - (e.GetType().FullName) - | ValueSome _ -> () - | _ -> failtestf "%s. Expected f to throw." message - } - type Expect = @@ -78,12 +80,13 @@ open System.Runtime.CompilerServices type ManualTimeProviderExtensions = [] - static member ForwardTimeAsync(this: ManualTimeProvider, time) = task { - this.Advance(time) - //https://github.com/dotnet/runtime/issues/85326 - do! Task.Yield() - do! Task.Delay(5) - } + static member ForwardTimeAsync(this: ManualTimeProvider, time) = + task { + this.Advance(time) + //https://github.com/dotnet/runtime/issues/85326 + do! Task.Yield() + do! Task.Delay(5) + } module CustomAwaiter = diff --git a/tests/IcedTasks.Tests/ParallelAsyncTests.fs b/tests/IcedTasks.Tests/ParallelAsyncTests.fs index 8e34a2a..9770cab 100644 --- a/tests/IcedTasks.Tests/ParallelAsyncTests.fs +++ b/tests/IcedTasks.Tests/ParallelAsyncTests.fs @@ -31,11 +31,12 @@ module ParallelAsyncTests = <| async { let data = 42 - let! actual = parallelAsync { + let! actual = + parallelAsync { - let! someValue = async.Return data - return someValue - } + let! someValue = async.Return data + return someValue + } Expect.equal actual data "Should be able to Return! value" } @@ -48,14 +49,15 @@ module ParallelAsyncTests = <| async { let data = 42 - let! actual = parallelAsync { - let result = data + let! actual = + parallelAsync { + let result = data - if true then - () + if true then + () - return result - } + return result + } Expect.equal actual data "Zero/Combine/Delay should work" } @@ -65,16 +67,17 @@ module ParallelAsyncTests = <| async { let data = 42 - let! actual = parallelAsync { - let data = data + let! actual = + parallelAsync { + let data = data - try - () - with _ -> - () + try + () + with _ -> + () - return data - } + return data + } Expect.equal actual data "TryWith should work" } @@ -86,16 +89,17 @@ module ParallelAsyncTests = <| async { let data = 42 - let! actual = parallelAsync { - let data = data + let! actual = + parallelAsync { + let data = data - try - () - finally - () + try + () + finally + () - return data - } + return data + } Expect.equal actual data "TryFinally should work" } @@ -108,10 +112,11 @@ module ParallelAsyncTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = parallelAsync { - use d = TestHelpers.makeDisposable (doDispose) - return data - } + let! actual = + parallelAsync { + use d = TestHelpers.makeDisposable (doDispose) + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -122,13 +127,14 @@ module ParallelAsyncTests = let mutable wasDisposed = false let doDispose () = wasDisposed <- true - let! actual = parallelAsync { - use! d = - TestHelpers.makeDisposable (doDispose) - |> async.Return + let! actual = + parallelAsync { + use! d = + TestHelpers.makeDisposable (doDispose) + |> async.Return - return data - } + return data + } Expect.equal actual data "Should be able to use use" Expect.isTrue wasDisposed "" @@ -137,10 +143,11 @@ module ParallelAsyncTests = <| async { let data = 42 - let! actual = parallelAsync { - use d = null - return data - } + let! actual = + parallelAsync { + use d = null + return data + } Expect.equal actual data "Should be able to use use" } @@ -152,12 +159,13 @@ module ParallelAsyncTests = let loops = 10 let mutable index = 0 - let! actual = parallelAsync { - while index < loops do - index <- index + 1 + let! actual = + parallelAsync { + while index < loops do + index <- index + 1 - return index - } + return index + } Expect.equal actual loops "Should be ok" } @@ -169,12 +177,13 @@ module ParallelAsyncTests = let loops = 10 let mutable index = 0 - let! actual = parallelAsync { - for i in [ 1..10 ] do - index <- i + i + let! actual = + parallelAsync { + for i in [ 1..10 ] do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -185,12 +194,13 @@ module ParallelAsyncTests = let loops = 10 let mutable index = 0 - let! actual = parallelAsync { - for i = 1 to loops do - index <- i + i + let! actual = + parallelAsync { + for i = 1 to loops do + index <- i + i - return index - } + return index + } Expect.equal actual index "Should be ok" } @@ -201,16 +211,17 @@ module ParallelAsyncTests = <| async { let data = 42 - let! actual = parallelAsync { - let! r1 = async.Return data - and! r2 = async.Return data - and! r3 = async.Return data - - return - r1 - + r2 - + r3 - } + let! actual = + parallelAsync { + let! r1 = async.Return data + and! r2 = async.Return data + and! r3 = async.Return data + + return + r1 + + r2 + + r3 + } Expect.equal actual 126 "and! works" } diff --git a/tests/IcedTasks.Tests/PoolingValueTaskTests.fs b/tests/IcedTasks.Tests/PoolingValueTaskTests.fs index e688e45..483e898 100644 --- a/tests/IcedTasks.Tests/PoolingValueTaskTests.fs +++ b/tests/IcedTasks.Tests/PoolingValueTaskTests.fs @@ -110,10 +110,11 @@ module PoolingValueTaskTests = let expected = "lol" let fooTask: ValueTask<_> = ValueTask.FromResult expected - let outerTask = poolingValueTask { - let! result = fooTask - return result - } + let outerTask = + poolingValueTask { + let! result = fooTask + return result + } let! actual = outerTask @@ -135,10 +136,11 @@ module PoolingValueTaskTests = <| async { let expected = "lol" - let outerTask = poolingValueTask { - let! result = Task.FromResult expected - return result - } + let outerTask = + poolingValueTask { + let! result = Task.FromResult expected + return result + } let! actual = outerTask @@ -153,10 +155,11 @@ module PoolingValueTaskTests = let expected = "lol" let fooTask = async.Return expected - let outerTask = poolingValueTask { - let! result = fooTask - return result - } + let outerTask = + poolingValueTask { + let! result = fooTask + return result + } let! actual = outerTask diff --git a/tests/IcedTasks.Tests/ValueTaskTests.fs b/tests/IcedTasks.Tests/ValueTaskTests.fs index 99faee7..6e5f4d4 100644 --- a/tests/IcedTasks.Tests/ValueTaskTests.fs +++ b/tests/IcedTasks.Tests/ValueTaskTests.fs @@ -110,10 +110,11 @@ module ValueTaskTests = let expected = "lol" let fooTask: ValueTask<_> = ValueTask.FromResult expected - let outerTask = valueTask { - let! result = fooTask - return result - } + let outerTask = + valueTask { + let! result = fooTask + return result + } let! actual = outerTask @@ -135,10 +136,11 @@ module ValueTaskTests = <| async { let expected = "lol" - let outerTask = valueTask { - let! result = Task.FromResult expected - return result - } + let outerTask = + valueTask { + let! result = Task.FromResult expected + return result + } let! actual = outerTask @@ -153,10 +155,11 @@ module ValueTaskTests = let expected = "lol" let fooTask = async.Return expected - let outerTask = valueTask { - let! result = fooTask - return result - } + let outerTask = + valueTask { + let! result = fooTask + return result + } let! actual = outerTask