text: /* eslint-disable class-methods-use-this */
  /**
   * @license
   * MIT License
   *
   * Copyright (c) 2019 Alexis Munsayac
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in all
   * copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   * SOFTWARE.
   *
   *
   * @author Alexis Munsayac <alexis.munsayac@gmail.com>
   * @copyright Alexis Munsayac 2019
   */
  /**
   * @external {Cancellable} https://lxsmnsyc.github.io/rx-cancellable/
   */
  import ImmediateScheduler from './immediate.node';
  import AsyncScheduler from './async';
  import TimeoutScheduler from './timeout';
  import CurrentScheduler from './current';
  import TickScheduler from './tick';
  import SchedulerInterface from './scheduler-interface';
  
  /**
   * Scheduler is an object that specifies an API for scheduling units of work.
   * These units of work are scheduled either executed immediately or enqueued and
   * executed using a callback mechanism.
   *
   * Scheduler provides 5 types of scheduling mechanism:
   * - Current: executes the task immediately.
   * - Immediate: schedules the task for the next frame.
   * - Async: schedules the task asynchronously (as a microtask).
   * - Timeout: schedules the task using setTimeout.
   * - Tick: schedules the task using process.nextTick.
   */
  export default class Scheduler {
    /**
     * Interface for all scheduler types.
     */
    static get interface() {
      return SchedulerInterface;
    }
  
    /**
     * A Scheduler that allows scheduling on the current thread.
     * @returns {CurrentScheduler}
     */
    static get current() {
      return CurrentScheduler.instance;
    }
  
    /**
     * A Scheduler that allows immediate scheduling, using requestAnimationFrame.
     * @returns {ImmediateScheduler}
     */
    static get immediate() {
      return ImmediateScheduler.instance;
    }
  
    /**
     * A Scheduler that allows async scheduling on the current thread.
     * @returns {AsyncScheduler}
     */
    static get async() {
      return AsyncScheduler.instance;
    }
  
    /**
     * A Scheduler that allows timeout scheduling on the current thread.
     * @returns {TimeoutScheduler}
     */
    static get timeout() {
      return TimeoutScheduler.instance;
    }
  
  
    /**
     * A Scheduler that allows scheduling using process.nextTick.
     * @returns {TickScheduler}
     */
    static get tick() {
      return TickScheduler.instance;
    }
  }
  