// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Collections; using System.Collections.Generic; using System.Threading; namespace Microsoft.ClearScript.Test { // ReSharper disable once PartialTypeWithSinglePart public static partial class TestEnumerable { public interface IDisposableEnumeratorFactory { int DisposedEnumeratorCount { get; } } public static IEnumerable CreateGeneric(params T[] items) { return CreateInternal(items); } public static IEnumerable Create(params T[] items) { return CreateGeneric(items); } private static TestEnumerableImpl CreateInternal(T[] items) { return new TestEnumerableImpl(items); } // ReSharper disable once PartialTypeWithSinglePart private partial class TestEnumerableImpl : IEnumerable, IDisposableEnumeratorFactory { private readonly T[] items; private int disposedEnumeratorCount; int IDisposableEnumeratorFactory.DisposedEnumeratorCount => disposedEnumeratorCount; public TestEnumerableImpl(T[] items) { this.items = items; } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(this); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } // ReSharper disable once PartialTypeWithSinglePart private partial class Enumerator : IEnumerator { private readonly TestEnumerableImpl enumerable; private int index = -1; public Enumerator(TestEnumerableImpl enumerable) { this.enumerable = enumerable; } T IEnumerator.Current => enumerable.items[index]; object IEnumerator.Current => ((IEnumerator)this).Current; bool IEnumerator.MoveNext() { return ++index < enumerable.items.Length; } void IEnumerator.Reset() { throw new NotImplementedException(); } void IDisposable.Dispose() { Interlocked.Increment(ref enumerable.disposedEnumeratorCount); } } } } }