namespace Caliburn.Micro.Core {
using System;
using System.Collections.Generic;
///
/// An implementation of that enables sequential execution of multiple results.
///
public class SequentialResult : IResult {
readonly IEnumerator enumerator;
CoroutineExecutionContext context;
///
/// Initializes a new instance of the class.
///
/// The enumerator.
public SequentialResult(IEnumerator enumerator) {
this.enumerator = enumerator;
}
///
/// Occurs when execution has completed.
///
public event EventHandler Completed = delegate { };
///
/// Executes the result using the specified context.
///
/// The context.
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 });
}
}
}