using System.Collections;
using System.Collections.Generic;

namespace MemoryPools.Collections.Linq
{
	internal sealed class GenericPoolingEnumerator<T> : IPoolingEnumerator<T>
	{
		private IEnumerator<T> _source;
    
		public GenericPoolingEnumerator<T> Init(IEnumerator<T> source)
		{
			_source = source;
			return this;
		}

		public bool MoveNext() => _source.MoveNext();

		public void Reset() => _source.Reset();
		
		object IPoolingEnumerator.Current => Current!;

		public T Current => _source.Current;
    
		public void Dispose()
		{
			_source.Dispose();
			_source = default!;
			Pool<GenericPoolingEnumerator<T>>.Return(this);
		}
	}

	internal sealed class GenericEnumerator<T> : IEnumerator<T>
	{
		private IPoolingEnumerator<T> _source;
    
		public GenericEnumerator<T> Init(IPoolingEnumerator<T> source)
		{
			_source = source;
			return this;
		}

		public bool MoveNext() => _source.MoveNext();

		public void Reset() => _source.Reset();
		
		object IEnumerator.Current => Current!;

		public T Current => _source.Current;
    
		public void Dispose()
		{
			_source.Dispose();
			_source = default!;
			Pool<GenericEnumerator<T>>.Return(this);
		}
	}
}