Skip to content

Commit 1a63ba1

Browse files
committed
Use ValueTask<T> for aggregates to improve ergonomics when used in e.g. Select.
1 parent b7cc8e7 commit 1a63ba1

File tree

79 files changed

+2045
-2019
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+2045
-2019
lines changed

Ix.NET/Source/System.Interactive.Async.Providers.Tests/AsyncQueryableExTests.Generated.tt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ foreach (var m in typeof(AsyncEnumerableEx).GetMethods()
185185
{
186186
var td = m.ReturnType.GetGenericTypeDefinition();
187187

188-
if (td == typeof(Task<>))
188+
if (td.Name.EndsWith("Task`1")) // NB: Covers Task and ValueTask
189189
{
190190
factory = "ExecuteAsync<" + toQuotedImpl(m.ReturnType.GetGenericArguments()[0], -1, false) + ">";
191191

@@ -453,7 +453,7 @@ if (indexes.Count != 0)
453453

454454
if (!failing.Contains(tm.Name))
455455
{
456-
if (tmRet == typeof(Task<>))
456+
if (tmRet.Name.EndsWith("Task`1")) // NB: Covers Task and ValueTask
457457
{
458458
#>
459459
AssertEx.SucceedOrFailProper(() => res.Wait());
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System.Threading.Tasks;
6+
7+
namespace Tests
8+
{
9+
public static class ValueTaskExtensions
10+
{
11+
public static void Wait<T>(this ValueTask<T> task) => task.AsTask().Wait();
12+
}
13+
}

Ix.NET/Source/System.Interactive.Async.Providers/System/Linq/AsyncQueryableEx.Generated.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ public static IAsyncQueryable<TSource> IgnoreElements<TSource>(this IAsyncQuerya
598598
#endif
599599
}
600600

601-
public static Task<bool> IsEmptyAsync<TSource>(this IAsyncQueryable<TSource> source, CancellationToken cancellationToken = default)
601+
public static ValueTask<bool> IsEmptyAsync<TSource>(this IAsyncQueryable<TSource> source, CancellationToken cancellationToken = default)
602602
{
603603
if (source == null)
604604
throw new ArgumentNullException(nameof(source));
@@ -610,7 +610,7 @@ public static Task<bool> IsEmptyAsync<TSource>(this IAsyncQueryable<TSource> sou
610610
#endif
611611
}
612612

613-
public static Task<TSource> MaxAsync<TSource>(this IAsyncQueryable<TSource> source, IComparer<TSource> comparer, CancellationToken cancellationToken = default)
613+
public static ValueTask<TSource> MaxAsync<TSource>(this IAsyncQueryable<TSource> source, IComparer<TSource> comparer, CancellationToken cancellationToken = default)
614614
{
615615
if (source == null)
616616
throw new ArgumentNullException(nameof(source));
@@ -622,7 +622,7 @@ public static Task<TSource> MaxAsync<TSource>(this IAsyncQueryable<TSource> sour
622622
#endif
623623
}
624624

625-
public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
625+
public static ValueTask<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
626626
{
627627
if (source == null)
628628
throw new ArgumentNullException(nameof(source));
@@ -636,7 +636,7 @@ public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryabl
636636
#endif
637637
}
638638

639-
public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, CancellationToken cancellationToken = default)
639+
public static ValueTask<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, CancellationToken cancellationToken = default)
640640
{
641641
if (source == null)
642642
throw new ArgumentNullException(nameof(source));
@@ -650,7 +650,7 @@ public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryabl
650650
#endif
651651
}
652652

653-
public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
653+
public static ValueTask<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
654654
{
655655
if (source == null)
656656
throw new ArgumentNullException(nameof(source));
@@ -664,7 +664,7 @@ public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryabl
664664
#endif
665665
}
666666

667-
public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
667+
public static ValueTask<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
668668
{
669669
if (source == null)
670670
throw new ArgumentNullException(nameof(source));
@@ -678,7 +678,7 @@ public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryabl
678678
#endif
679679
}
680680

681-
public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
681+
public static ValueTask<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
682682
{
683683
if (source == null)
684684
throw new ArgumentNullException(nameof(source));
@@ -692,7 +692,7 @@ public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryabl
692692
#endif
693693
}
694694

695-
public static Task<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
695+
public static ValueTask<IList<TSource>> MaxByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
696696
{
697697
if (source == null)
698698
throw new ArgumentNullException(nameof(source));
@@ -718,7 +718,7 @@ public static IAsyncQueryable<TSource> Merge<TSource>(this IAsyncQueryable<IAsyn
718718
#endif
719719
}
720720

721-
public static Task<TSource> MinAsync<TSource>(this IAsyncQueryable<TSource> source, IComparer<TSource> comparer, CancellationToken cancellationToken = default)
721+
public static ValueTask<TSource> MinAsync<TSource>(this IAsyncQueryable<TSource> source, IComparer<TSource> comparer, CancellationToken cancellationToken = default)
722722
{
723723
if (source == null)
724724
throw new ArgumentNullException(nameof(source));
@@ -730,7 +730,7 @@ public static Task<TSource> MinAsync<TSource>(this IAsyncQueryable<TSource> sour
730730
#endif
731731
}
732732

733-
public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
733+
public static ValueTask<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
734734
{
735735
if (source == null)
736736
throw new ArgumentNullException(nameof(source));
@@ -744,7 +744,7 @@ public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryabl
744744
#endif
745745
}
746746

747-
public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, CancellationToken cancellationToken = default)
747+
public static ValueTask<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, CancellationToken cancellationToken = default)
748748
{
749749
if (source == null)
750750
throw new ArgumentNullException(nameof(source));
@@ -758,7 +758,7 @@ public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryabl
758758
#endif
759759
}
760760

761-
public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
761+
public static ValueTask<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, CancellationToken cancellationToken = default)
762762
{
763763
if (source == null)
764764
throw new ArgumentNullException(nameof(source));
@@ -772,7 +772,7 @@ public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryabl
772772
#endif
773773
}
774774

775-
public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
775+
public static ValueTask<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, CancellationToken, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
776776
{
777777
if (source == null)
778778
throw new ArgumentNullException(nameof(source));
@@ -786,7 +786,7 @@ public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryabl
786786
#endif
787787
}
788788

789-
public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
789+
public static ValueTask<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
790790
{
791791
if (source == null)
792792
throw new ArgumentNullException(nameof(source));
@@ -800,7 +800,7 @@ public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryabl
800800
#endif
801801
}
802802

803-
public static Task<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
803+
public static ValueTask<IList<TSource>> MinByAsync<TSource, TKey>(this IAsyncQueryable<TSource> source, Expression<Func<TSource, ValueTask<TKey>>> keySelector, IComparer<TKey> comparer, CancellationToken cancellationToken = default)
804804
{
805805
if (source == null)
806806
throw new ArgumentNullException(nameof(source));

Ix.NET/Source/System.Interactive.Async.Providers/System/Linq/AsyncQueryableEx.Generated.tt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ foreach (var m in typeof(AsyncEnumerableEx).GetMethods()
189189
{
190190
var td = m.ReturnType.GetGenericTypeDefinition();
191191

192-
if (td == typeof(Task<>))
192+
if (td.Name.EndsWith("Task`1")) // NB: Covers Task and ValueTask
193193
{
194194
factory = "ExecuteAsync<" + toQuotedImpl(m.ReturnType.GetGenericArguments()[0], -1, false) + ">";
195195

Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/IsEmpty.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class IsEmpty : AsyncEnumerableExTests
1515
[Fact]
1616
public async Task IsEmpty_Null()
1717
{
18-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.IsEmptyAsync<int>(default));
19-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.IsEmptyAsync<int>(default, CancellationToken.None));
18+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.IsEmptyAsync<int>(default).AsTask());
19+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.IsEmptyAsync<int>(default, CancellationToken.None).AsTask());
2020
}
2121
}
2222
}

Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/Max.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ public class Max : AsyncEnumerableExTests
1616
[Fact]
1717
public async Task Max_Null()
1818
{
19-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxAsync(default, Comparer<DateTime>.Default));
19+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxAsync(default, Comparer<DateTime>.Default).AsTask());
2020

21-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxAsync(default, Comparer<DateTime>.Default, CancellationToken.None));
21+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxAsync(default, Comparer<DateTime>.Default, CancellationToken.None).AsTask());
2222
}
2323
}
2424
}

Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/MaxBy.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ public class MaxBy : AsyncEnumerableExTests
1616
[Fact]
1717
public async Task MaxBy_Null()
1818
{
19-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x));
20-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>)));
19+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x).AsTask());
20+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>)).AsTask());
2121

22-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default));
23-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>), Comparer<int>.Default));
22+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default).AsTask());
23+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>), Comparer<int>.Default).AsTask());
2424

25-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x, CancellationToken.None));
26-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>), CancellationToken.None));
25+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x, CancellationToken.None).AsTask());
26+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>), CancellationToken.None).AsTask());
2727

28-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default, CancellationToken.None));
29-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>), Comparer<int>.Default, CancellationToken.None));
28+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default, CancellationToken.None).AsTask());
29+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MaxByAsync(Return42, default(Func<int, int>), Comparer<int>.Default, CancellationToken.None).AsTask());
3030
}
3131

3232
[Fact]
@@ -43,7 +43,7 @@ public async Task MaxBy2()
4343
{
4444
var xs = new int[0].ToAsyncEnumerable().MaxByAsync(x => x / 2);
4545

46-
await AssertThrowsAsync<InvalidOperationException>(xs);
46+
await AssertThrowsAsync<InvalidOperationException>(xs.AsTask());
4747
}
4848

4949
[Fact]

Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/Min.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ public class Min : AsyncEnumerableExTests
1616
[Fact]
1717
public async Task Min_Null()
1818
{
19-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinAsync(default, Comparer<DateTime>.Default));
19+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinAsync(default, Comparer<DateTime>.Default).AsTask());
2020

21-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinAsync(default, Comparer<DateTime>.Default, CancellationToken.None));
21+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinAsync(default, Comparer<DateTime>.Default, CancellationToken.None).AsTask());
2222
}
2323
}
2424
}

Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/MinBy.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ public class MinBy : AsyncEnumerableExTests
1616
[Fact]
1717
public async Task MinBy_Null()
1818
{
19-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x));
20-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>)));
19+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x).AsTask());
20+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>)).AsTask());
2121

22-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default));
23-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>), Comparer<int>.Default));
22+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default).AsTask());
23+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>), Comparer<int>.Default).AsTask());
2424

25-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x, CancellationToken.None));
26-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>), CancellationToken.None));
25+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x, CancellationToken.None).AsTask());
26+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>), CancellationToken.None).AsTask());
2727

28-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default, CancellationToken.None));
29-
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>), Comparer<int>.Default, CancellationToken.None));
28+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(default(IAsyncEnumerable<int>), x => x, Comparer<int>.Default, CancellationToken.None).AsTask());
29+
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerableEx.MinByAsync(Return42, default(Func<int, int>), Comparer<int>.Default, CancellationToken.None).AsTask());
3030
}
3131

3232
[Fact]
@@ -43,7 +43,7 @@ public async Task MinBy2Async()
4343
{
4444
var xs = new int[0].ToAsyncEnumerable().MinByAsync(x => x / 2);
4545

46-
await AssertThrowsAsync<InvalidOperationException>(xs);
46+
await AssertThrowsAsync<InvalidOperationException>(xs.AsTask());
4747
}
4848

4949
[Fact]

0 commit comments

Comments
 (0)