| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | namespace Caliburn.Micro.Core {    using System;    using System.Collections.Generic;    /// <summary>    ///   An implementation of <see cref = "IResult" /> that enables sequential execution of multiple results.    /// </summary>    public class SequentialResult : IResult {        readonly IEnumerator<IResult> enumerator;        CoroutineExecutionContext context;        /// <summary>        ///   Initializes a new instance of the <see cref = "SequentialResult" /> class.        /// </summary>        /// <param name = "enumerator">The enumerator.</param>        public SequentialResult(IEnumerator<IResult> enumerator) {            this.enumerator = enumerator;        }        /// <summary>        ///   Occurs when execution has completed.        /// </summary>        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };        /// <summary>        ///   Executes the result using the specified context.        /// </summary>        /// <param name = "context">The context.</param>        public void Execute(CoroutineExecutionContext context) {            this.context = context;            ChildCompleted(null, new ResultCompletionEventArgs());        }        void ChildCompleted(object sender, ResultCompletionEventArgs args) {            var previous = sender as IResult;            if (previous != null) {                previous.Completed -= ChildCompleted;            }            if(args.Error != null || args.WasCancelled) {                OnComplete(args.Error, args.WasCancelled);                return;            }            var moveNextSucceeded = false;            try {                moveNextSucceeded = enumerator.MoveNext();            }            catch(Exception ex) {                OnComplete(ex, false);                return;            }            if(moveNextSucceeded) {                try {                    var next = enumerator.Current;                    IoC.BuildUp(next);                    next.Completed += ChildCompleted;                    next.Execute(context);                }                catch(Exception ex) {                    OnComplete(ex, false);                    return;                }            }            else {                OnComplete(null, false);            }        }        void OnComplete(Exception error, bool wasCancelled) {            enumerator.Dispose();            Completed(this, new ResultCompletionEventArgs { Error = error, WasCancelled = wasCancelled });        }    }}
 |