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

namespace ZeroLevel.Services.Async.Internal
{
	/// <remarks>Turns out iterating through manually boxed iterator is a bit faster than through automatically boxed one.</remarks>
	internal class BoxedEnumerator<TItem, TEnumerator> 
		: IEnumerator<TItem> where TEnumerator : struct, IEnumerator<TItem>
	{
		private TEnumerator _structEnumerator;

		public BoxedEnumerator(TEnumerator structEnumerator)
		{
			_structEnumerator = structEnumerator;
		}

		public TItem Current => _structEnumerator.Current;
		object IEnumerator.Current => Current;
		public void Dispose() => _structEnumerator.Dispose();
		public bool MoveNext() => _structEnumerator.MoveNext();
		public void Reset() => _structEnumerator.Reset();
	}
}