Browse Source

Use C# 8.0 in Ix.

Bart De Smet 6 years ago
parent
commit
e07db06202

+ 22 - 0
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Max.cs

@@ -24,6 +24,27 @@ namespace System.Linq
                     comparer = Comparer<TSource>.Default;
                 }
 
+#if CSHARP8
+                await using (var e = source.GetAsyncEnumerator(cancellationToken).ConfigureAwait(false))
+                {
+                    if (!await e.MoveNextAsync())
+                        throw Error.NoElements();
+
+                    var max = e.Current;
+
+                    while (await e.MoveNextAsync())
+                    {
+                        var cur = e.Current;
+
+                        if (comparer.Compare(cur, max) > 0)
+                        {
+                            max = cur;
+                        }
+                    }
+
+                    return max;
+                }
+#else
                 var e = source.GetAsyncEnumerator(cancellationToken);
 
                 try
@@ -49,6 +70,7 @@ namespace System.Linq
                 {
                     await e.DisposeAsync().ConfigureAwait(false);
                 }
+#endif
             }
         }
     }

+ 22 - 0
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/Min.cs

@@ -24,6 +24,27 @@ namespace System.Linq
                     comparer = Comparer<TSource>.Default;
                 }
 
+#if CSHARP8
+                await using (var e = source.GetAsyncEnumerator(cancellationToken).ConfigureAwait(false))
+                {
+                    if (!await e.MoveNextAsync())
+                        throw Error.NoElements();
+
+                    var min = e.Current;
+
+                    while (await e.MoveNextAsync())
+                    {
+                        var cur = e.Current;
+
+                        if (comparer.Compare(cur, min) < 0)
+                        {
+                            min = cur;
+                        }
+                    }
+
+                    return min;
+                }
+#else
                 var e = source.GetAsyncEnumerator(cancellationToken);
 
                 try
@@ -49,6 +70,7 @@ namespace System.Linq
                 {
                     await e.DisposeAsync().ConfigureAwait(false);
                 }
+#endif
             }
         }
     }

+ 90 - 0
Ix.NET/Source/System.Interactive.Async/System/Linq/Operators/MinBy.cs

@@ -110,6 +110,35 @@ namespace System.Linq
         {
             var result = new List<TSource>();
 
+#if CSHARP8
+            await using (var e = source.GetAsyncEnumerator(cancellationToken).ConfigureAwait(false))
+            {
+                if (!await e.MoveNextAsync())
+                    throw Error.NoElements();
+
+                var current = e.Current;
+                var resKey = keySelector(current);
+                result.Add(current);
+
+                while (await e.MoveNextAsync())
+                {
+                    var cur = e.Current;
+                    var key = keySelector(cur);
+
+                    var cmp = compare(key, resKey);
+
+                    if (cmp == 0)
+                    {
+                        result.Add(cur);
+                    }
+                    else if (cmp > 0)
+                    {
+                        result = new List<TSource> { cur };
+                        resKey = key;
+                    }
+                }
+            }
+#else
             var e = source.GetAsyncEnumerator(cancellationToken);
 
             try
@@ -143,6 +172,7 @@ namespace System.Linq
             {
                 await e.DisposeAsync().ConfigureAwait(false);
             }
+#endif
 
             return result;
         }
@@ -151,6 +181,35 @@ namespace System.Linq
         {
             var result = new List<TSource>();
 
+#if CSHARP8
+            await using (var e = source.GetAsyncEnumerator(cancellationToken).ConfigureAwait(false))
+            {
+                if (!await e.MoveNextAsync())
+                    throw Error.NoElements();
+
+                var current = e.Current;
+                var resKey = await keySelector(current).ConfigureAwait(false);
+                result.Add(current);
+
+                while (await e.MoveNextAsync())
+                {
+                    var cur = e.Current;
+                    var key = await keySelector(cur).ConfigureAwait(false);
+
+                    var cmp = compare(key, resKey);
+
+                    if (cmp == 0)
+                    {
+                        result.Add(cur);
+                    }
+                    else if (cmp > 0)
+                    {
+                        result = new List<TSource> { cur };
+                        resKey = key;
+                    }
+                }
+            }
+#else
             var e = source.GetAsyncEnumerator(cancellationToken);
 
             try
@@ -184,6 +243,7 @@ namespace System.Linq
             {
                 await e.DisposeAsync().ConfigureAwait(false);
             }
+#endif
 
             return result;
         }
@@ -193,6 +253,35 @@ namespace System.Linq
         {
             var result = new List<TSource>();
 
+#if CSHARP8
+            await using (var e = source.GetAsyncEnumerator(cancellationToken).ConfigureAwait(false))
+            {
+                if (!await e.MoveNextAsync())
+                    throw Error.NoElements();
+
+                var current = e.Current;
+                var resKey = await keySelector(current, cancellationToken).ConfigureAwait(false);
+                result.Add(current);
+
+                while (await e.MoveNextAsync())
+                {
+                    var cur = e.Current;
+                    var key = await keySelector(cur, cancellationToken).ConfigureAwait(false);
+
+                    var cmp = compare(key, resKey);
+
+                    if (cmp == 0)
+                    {
+                        result.Add(cur);
+                    }
+                    else if (cmp > 0)
+                    {
+                        result = new List<TSource> { cur };
+                        resKey = key;
+                    }
+                }
+            }
+#else
             var e = source.GetAsyncEnumerator(cancellationToken);
 
             try
@@ -226,6 +315,7 @@ namespace System.Linq
             {
                 await e.DisposeAsync().ConfigureAwait(false);
             }
+#endif
 
             return result;
         }