namespace MemoryPools.Collections.Specialized { public static partial class AsSingleQueryList { private class EnumerableTyped<T> : IPoolingEnumerable<T> { private PoolingList<T> _src; public IPoolingEnumerable<T> Init(PoolingList<T> src) { _src = src; return this; } public IPoolingEnumerator<T> GetEnumerator() { var src = _src; _src = default; Pool<EnumerableTyped<T>>.Return(this); return Pool<EnumeratorVal>.Get().Init(src); } IPoolingEnumerator IPoolingEnumerable.GetEnumerator() => GetEnumerator(); private class EnumeratorVal : IPoolingEnumerator<T> { private PoolingList<T> _src; private IPoolingEnumerator<T> _enumerator; public IPoolingEnumerator<T> Init(PoolingList<T> src) { _src = src; _enumerator = _src.GetEnumerator(); return this; } public bool MoveNext() => _enumerator.MoveNext(); public void Reset() { _enumerator?.Dispose(); _enumerator = _src.GetEnumerator(); } public T Current => _enumerator.Current; object IPoolingEnumerator.Current => Current; public void Dispose() { _enumerator?.Dispose(); _src?.Dispose(); Pool<PoolingList<T>>.Return(_src); Pool<EnumeratorVal>.Return(this); _src = default; } } } } }