private bool MoveNextForCurrent() { //Completed with the default yield break if (!_base.MoveNext()) { _base.MoveNext(); return(false); } //It is the current underlying enumerator result var current = _base.Current; VerifyChildStatus(current); var result = false; switch (current.ResultType) { case (ResultType.Wait): result = true; break; case (ResultType.Return): break; case (ResultType.YieldReturn): result = true; break; case (ResultType.YieldBreak): _base.MoveNext(); break; case (ResultType.Enumerator): _child = (CoroutineResultEnumerator)current.Result; result = true; break; case (ResultType.FluentBuilder): SetupFluentResultEnumerator(current); result = true; break; } return(result); }
// The bulk of the clean-up code is implemented in Dispose(bool) protected virtual void Dispose(bool disposing) { if (!_started) { Log.Warning("Not started {0}", InstanceName); } if (disposing) { // free managed resources if (_base != null) { _base.Dispose(); _base = null; if (_child != null) { _child.Dispose(); _child = null; } } } }
private bool MoveNextForChild() { if (_child == null) { return(false); } if (_child.MoveNext()) { var frb = _child.Current as FluentResultBuilder; if (frb != null && !frb.Type.HasFlag(FluentResultType.Waiting)) { //Bubble up the fluent Current = _child.Current; } return(true); } _child.MoveNext(); _child.Dispose(); _child = null; return(false); }
private void SetupFluentResultEnumerator(ICoroutineResult current) { var builder = (FluentResultBuilder)current; builder.Log = Log; if (builder.Type.HasFlag(FluentResultType.CoroutineFunction) && !builder.Type.HasFlag(FluentResultType.Waiting)) { _child = new CoroutineResultEnumerator(builder.InstanceName, builder.Coroutine.Execute().GetEnumerator()) { Log = Log }; } else if (builder.Type.HasFlag(FluentResultType.Waiting)) { _child = new CoroutineResultEnumerator(builder.InstanceName, builder.RunEnumerator().GetEnumerator()) { Log = Log }; } else { Current = builder; } }