using System.Collections; namespace Connected.Expressions.Collections; internal class EnumerateOnce : IEnumerable, IEnumerable { private IEnumerable? _enumerable; public EnumerateOnce(IEnumerable enumerable) { _enumerable = enumerable; } public IEnumerator GetEnumerator() { var en = Interlocked.Exchange(ref _enumerable, null); if (en is not null) return en.GetEnumerator(); throw new Exception("Enumerated more than once."); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }