-
Notifications
You must be signed in to change notification settings - Fork 160
Expand file tree
/
Copy pathTestEnumerable.cs
More file actions
114 lines (92 loc) · 3.48 KB
/
TestEnumerable.cs
File metadata and controls
114 lines (92 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.ClearScript.Test
{
// ReSharper disable once PartialTypeWithSinglePart
public static partial class TestEnumerable
{
public interface IDisposableEnumeratorFactory
{
int DisposedEnumeratorCount { get; }
}
public static IEnumerable<T> CreateGeneric<T>(params T[] items)
{
return CreateInternal(items);
}
public static IEnumerable Create<T>(params T[] items)
{
return CreateGeneric(items);
}
public static IAsyncEnumerable<T> CreateAsync<T>(params T[] items)
{
return CreateInternal(items);
}
private static TestEnumerableImpl<T> CreateInternal<T>(T[] items)
{
return new TestEnumerableImpl<T>(items);
}
// ReSharper disable once PartialTypeWithSinglePart
private partial class TestEnumerableImpl<T> : IEnumerable<T>, IAsyncEnumerable<T>, IDisposableEnumeratorFactory
{
private readonly T[] items;
private int disposedEnumeratorCount;
public TestEnumerableImpl(T[] items)
{
this.items = items;
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return new Enumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
// ReSharper disable once NotDisposedResourceIsReturned
return ((IEnumerable<T>)this).GetEnumerator();
}
IAsyncEnumerator<T> IAsyncEnumerable<T>.GetAsyncEnumerator(CancellationToken cancellationToken)
{
return new Enumerator(this);
}
int IDisposableEnumeratorFactory.DisposedEnumeratorCount => disposedEnumeratorCount;
// ReSharper disable once PartialTypeWithSinglePart
private partial class Enumerator : IEnumerator<T>, IAsyncEnumerator<T>
{
private readonly TestEnumerableImpl<T> enumerable;
private int index = -1;
public Enumerator(TestEnumerableImpl<T> enumerable)
{
this.enumerable = enumerable;
}
T IEnumerator<T>.Current => enumerable.items[index];
object IEnumerator.Current => ((IEnumerator<T>)this).Current;
bool IEnumerator.MoveNext()
{
return ++index < enumerable.items.Length;
}
void IEnumerator.Reset()
{
throw new NotImplementedException();
}
void IDisposable.Dispose()
{
Interlocked.Increment(ref enumerable.disposedEnumeratorCount);
}
T IAsyncEnumerator<T>.Current => ((IEnumerator<T>)this).Current;
ValueTask<bool> IAsyncEnumerator<T>.MoveNextAsync()
{
return new ValueTask<bool>(((IEnumerator)this).MoveNext());
}
ValueTask IAsyncDisposable.DisposeAsync()
{
((IDisposable)this).Dispose();
return default;
}
}
}
}
}