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;
            }
        }