瀏覽代碼

Using a singleton instance for Empty.

Bart De Smet 8 年之前
父節點
當前提交
82ad94d260
共有 1 個文件被更改,包括 10 次插入7 次删除
  1. 10 7
      Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Empty.cs

+ 10 - 7
Ix.NET/Source/System.Linq.Async/System/Linq/Operators/Empty.cs

@@ -10,14 +10,13 @@ namespace System.Linq
 {
     public static partial class AsyncEnumerable
     {
-        public static IAsyncEnumerable<TValue> Empty<TValue>()
-        {
-            return new EmptyAsyncIterator<TValue>();
-        }
+        public static IAsyncEnumerable<TValue> Empty<TValue>() => EmptyAsyncIterator<TValue>.Instance;
 
-        private sealed class EmptyAsyncIterator<TValue> : AsyncIterator<TValue>, IAsyncPartition<TValue>
+        private sealed class EmptyAsyncIterator<TValue> : IAsyncPartition<TValue>, IAsyncEnumerator<TValue>
         {
-            public override AsyncIterator<TValue> Clone() => new EmptyAsyncIterator<TValue>();
+            public static readonly EmptyAsyncIterator<TValue> Instance = new EmptyAsyncIterator<TValue>();
+
+            public TValue Current => default(TValue);
 
             public Task<int> GetCountAsync(bool onlyIfCheap, CancellationToken cancellationToken) => Task.FromResult(0);
 
@@ -35,7 +34,11 @@ namespace System.Linq
 
             public Task<Maybe<TValue>> TryGetLast() => Task.FromResult(new Maybe<TValue>());
 
-            protected override Task<bool> MoveNextCore() => TaskExt.False;
+            public Task<bool> MoveNextAsync() => TaskExt.False;
+
+            public IAsyncEnumerator<TValue> GetAsyncEnumerator() => this;
+
+            public Task DisposeAsync() => TaskExt.CompletedTask;
         }
     }
 }