namespace Caliburn.Micro.Core {
    using System;
    /// 
    /// Extension methods for  instances.
    /// 
    public static class ResultExtensions {
        /// 
        /// Adds behavior to the result which is executed when the  was cancelled.
        /// 
        /// The result to decorate.
        /// The coroutine to execute when  was canceled.
        /// 
        public static IResult WhenCancelled(this IResult result, Func coroutine) {
            return new ContinueResultDecorator(result, coroutine);
        }
        /// 
        /// Overrides  of the decorated  instance.
        /// 
        /// The result to decorate.
        /// 
        public static IResult OverrideCancel(this IResult result) {
            return new OverrideCancelResultDecorator(result);
        }
        /// 
        /// Rescues  from the decorated  by executing a  coroutine.
        /// 
        /// The type of the exception we want to perform the rescue on.
        /// The result to decorate.
        /// The rescue coroutine.
        /// Set to true to cancel the result after executing rescue.
        /// 
        public static IResult Rescue(this IResult result, Func rescue,
            bool cancelResult = true)
            where TException : Exception {
            return new RescueResultDecorator(result, rescue, cancelResult);
        }
        /// 
        /// Rescues any exception from the decorated  by executing a  coroutine.
        /// 
        /// The result to decorate.
        /// The rescue coroutine.
        /// Set to true to cancel the result after executing rescue.
        /// 
        public static IResult Rescue(this IResult result, Func rescue,
            bool cancelResult = true) {
            return Rescue(result, rescue, cancelResult);
        }
    }
}