export interface Subscribable { source: Source; subscribe(nextOrObserver?: Subscriber | ((x: T) => any), error?: (error: Error) => any, complete?: (x?: T) => any): Subscription; } export interface Source { run(sink: Sink, scheduler: Scheduler): Disposable; } export interface Sink { event(time: number, value: T): void; end(time: number, value?: T): void; error(time: number, err: Error): void; } export interface Scheduler { now(): number; asap(task: Task): ScheduledTask; delay(delayTime: number, task: Task): ScheduledTask; periodic(period: number, task: Task): ScheduledTask; schedule(delay: number, period: number, task: Task): ScheduledTask; cancel(task: ScheduledTask): void; cancelAll(predicate: (task: ScheduledTask) => boolean): void; } export interface Timeline { nextArrival(): number; isEmpty(): boolean; add(task: T): void; remove(task: T): boolean; removeAll(f: (task: T) => boolean): void; runTasks(time: number, runTask: (task: T) => any): void; } export interface Timeslot { time: number; events: T[]; } export interface Timer { now(): number; setTimer(fn: () => any, delayTime: number): T | number; clearTimer(task: T): any; } export interface Task { run(time: number): void; error(time: number, e: Error): void; dispose(): void; } export interface ScheduledTask { task: Task; run(): void; error(err: Error): void; dispose(): void; } export interface Disposable { dispose(): void | Promise; } export interface Subscriber { next(value: A): void; error(err: Error): void; complete(value?: A): void; } export interface Subscription { unsubscribe(): void; }