Scheduler API

typedef void TimerCallback();

class TaskSettings {
  const TaskSettings({
    this.idle: false, // tasks that should run during the idle phase
    this.layout: false, // tasks that should run during the layout phase
    this.paint: false, // tasks that should run during the paint phase
    this.touch: false, // tasks that should run while a pointer is down
  });
  final bool idle;
  final bool layout;
  final bool paint;
  final bool touch;
}

const idleTask = const TaskSettings(idle: true);
const t0 = null;
const t1ms = const Duration(milliseconds: 1.0);

// Priorities
// (these are intentionally not constants, so you can tweak them at runtime)
int IdlePriority = 0; // tasks that can be delayed arbitrarily
int FutureLayoutPriority = 1000; // tasks that prepare layout
int TimerAnimationPriority = 3000; // tasks related to animations 
int InputPriority = 4000; // input events
int InputAnimationPriority = 5000; // framework-fired events for scrolling

class Task {
  external Task(callback, {
    Duration delay: t0, // how long to wait before scheduling this task; null means run it now (same as duration 0)
    Duration budget: t1ms, // how long to allow the task to run before firing an exception; null means no timeout
    TaskSettings settings: idleTask, // what phases to allow the task to run during
    int priority: 0, // the greater the number, the more likely it is to run
    bool defer: false // punts this task until the next loop (after we're done with paint)
  });
  external void cancel(); // prevents the task from running, if it hasn't run yet
  external bool get active; // true until fired or until canceled
}

// The Dart native mechanisms for scheduling tasks, as listed below,
// get configured as follows:
//
//  delay: duration argument for the Timer constructors, otherwise null (0)
//  budget: 1ms
//  settings: same as for the task that triggered this task
//  priority: same as for the task that triggered this task
//  defer: false
//
// method: scheduleMicrotask(Function void callback())
// constructor: Future.microtask(...) // calls scheduleMicrotask() to do the work
// constructor: Timer (Duration duration, Function void callback())
// constructor: Timer.periodic(Duration duration, Function void callback(Timer timer))