/// <summary> /// Tries to get value from collection and return success status. /// Notifies if next value is ready. /// Resets enumerator if source is inexhaustible and last element of collection is already reached. /// </summary> /// <param name="value">Output parameter for pulled value.</param> /// <returns>True if value was successfully extracted or false otherwise.</returns> public override bool Pull(out T value) { if (_hasNext) { value = _enumerator.Current; _hasNext = _enumerator.MoveNext(); if (_hasNext || !_exhaustible) { ValueReady?.Invoke(this); } return(true); } else { if (!_exhaustible) { _enumerator.Reset(); _hasNext = _enumerator.MoveNext(); return(Pull(out value)); } else { _exhausted = true; value = default(T); return(false); } } }
/// <summary> /// Tries to get value and return success status. Notifies if next value is ready. /// </summary> /// <param name="value">Output parameter for pulled value.</param> /// <returns>True if value was successfully extracted or false otherwise.</returns> public override bool Pull(out T value) { if (!_exhausted) { value = _value; if (_exhaustible) { _exhausted = true; } else { ValueReady?.Invoke(this); } return(true); } value = default(T); return(false); }
/// <summary> /// Event handler method for ValueEnqueued event fired by inner queue. /// </summary> private void ValueEnqueued() { ValueReady?.Invoke(this); }