using System.Collections; using System.Collections.Generic; namespace MemoryPools.Collections.Linq { internal class GenericPoolingEnumerable : IPoolingEnumerable { private IEnumerable _enumerable; public GenericPoolingEnumerable Init(IEnumerable enumerable) { _enumerable = enumerable; return this; } public IPoolingEnumerator GetEnumerator() { var enumerator = _enumerable.GetEnumerator(); _enumerable = default; Pool>.Return(this); return Pool>.Get().Init(enumerator); } IPoolingEnumerator IPoolingEnumerable.GetEnumerator() { return GetEnumerator(); } } internal class GenericEnumerable : IEnumerable { private IPoolingEnumerable _enumerable; public GenericEnumerable Init(IPoolingEnumerable enumerable) { _enumerable = enumerable; return this; } public IEnumerator GetEnumerator() { var enumerator = _enumerable.GetEnumerator(); _enumerable = default; Pool>.Return(this); return Pool>.Get().Init(enumerator); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } }