// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
using System;
namespace System.Reactive.Concurrency
{
    public static partial class Scheduler
    {
        /// 
        /// Returns a scheduler that represents the original scheduler, without any of its interface-based optimizations (e.g. long running scheduling).
        /// 
        /// Scheduler to disable all optimizations for.
        /// Proxy to the original scheduler but without any optimizations enabled.
        ///  is null.
        public static IScheduler DisableOptimizations(this IScheduler scheduler)
        {
            if (scheduler == null)
                throw new ArgumentNullException("scheduler");
            return new DisableOptimizationsScheduler(scheduler);
        }
        /// 
        /// Returns a scheduler that represents the original scheduler, without the specified set of interface-based optimizations (e.g. long running scheduling).
        /// 
        /// Scheduler to disable the specified optimizations for.
        /// Types of the optimization interfaces that have to be disabled.
        /// Proxy to the original scheduler but without the specified optimizations enabled.
        ///  or  is null.
        public static IScheduler DisableOptimizations(this IScheduler scheduler, params Type[] optimizationInterfaces)
        {
            if (scheduler == null)
                throw new ArgumentNullException("scheduler");
            if (optimizationInterfaces == null)
                throw new ArgumentNullException("optimizationInterfaces");
            return new DisableOptimizationsScheduler(scheduler, optimizationInterfaces);
        }
        /// 
        /// Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.
        /// 
        /// Type of the exception to check for.
        /// Scheduler to apply an exception filter for.
        /// Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.
        /// Wrapper around the original scheduler, enforcing exception handling.
        ///  or  is null.
        public static IScheduler Catch(this IScheduler scheduler, Func handler)
            where TException : Exception
        {
            if (scheduler == null)
                throw new ArgumentNullException("scheduler");
            if (handler == null)
                throw new ArgumentNullException("handler");
            return new CatchScheduler(scheduler, handler);
        }
    }
}