aeon-scheduler 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../types/dist/index.js","../src/clock.ts","../src/heap.ts","../src/defaultScheduler.ts","../src/virtualScheduler.ts"],"sourcesContent":["/**\n * Branded types for temporal values.\n *\n * Branding prevents accidental mixing of Time, Duration, and Offset\n * at the type level while remaining plain numbers at runtime.\n */ // --- Constructors ---\n/** Wrap a raw millisecond value as a Time. */ const toTime = (ms)=>ms;\n/** Wrap a raw millisecond value as a Duration. */ const toDuration = (ms)=>ms;\n/** Wrap a raw millisecond value as an Offset. */ const toOffset = (ms)=>ms;\n// --- Arithmetic ---\n/** Compute the Duration between two Time points. */ const timeDiff = (a, b)=>a - b;\n/** Advance a Time by a Duration. */ const timeAdd = (t, d)=>t + d;\n/** Advance a Time by an Offset. */ const timeShift = (t, o)=>t + o;\n// --- Constants ---\n/** Time zero — the epoch. */ const TIME_ZERO = 0;\n/** Zero duration. */ const DURATION_ZERO = 0;\n/** Zero offset. */ const OFFSET_ZERO = 0;\n\n/**\n * Higher-Kinded Type encoding via URI-indexed Kind map.\n *\n * Uses module augmentation (Effect-TS / fp-ts style) so that each\n * package can register its own types without circular imports.\n */ // biome-ignore lint/suspicious/noEmptyInterface: open for module augmentation\n// --- Derived combinators ---\n/** Lift a binary function over two Applicative values. */ const liftA2 = (A)=>(f, fa1, fa2)=>A.ap(A.map((a1)=>(a2)=>f(a1, a2), fa1), fa2);\n/** Lift a ternary function over three Applicative values. */ const liftA3 = (A)=>(f, fa1, fa2, fa3)=>A.ap(A.ap(A.map((a1)=>(a2)=>(a3)=>f(a1, a2, a3), fa1), fa2), fa3);\n\n/**\n * Core runtime interfaces for the push/pull reactive system.\n *\n * These define the contracts that packages/core and packages/scheduler implement.\n * Denotational meanings are stated in JSDoc.\n */ // --- URI constants for HKT registration ---\nconst EventURI = \"Event\";\nconst BehaviorURI = \"Behavior\";\n\nexport { BehaviorURI, DURATION_ZERO, EventURI, OFFSET_ZERO, TIME_ZERO, liftA2, liftA3, timeAdd, timeDiff, timeShift, toDuration, toOffset, toTime };\n//# sourceMappingURL=index.js.map\n","/**\n * Clock abstractions.\n *\n * A Clock is the single source of truth for \"what time is it.\"\n * Different clocks serve different purposes: real time for production,\n * virtual time for testing.\n */\n\nimport { type Time, toTime } from \"aeon-types\";\n\n/** A source of time. */\nexport interface Clock {\n now(): Time;\n}\n\n/** Clock using performance.now() — high-resolution, monotonic. */\nexport class PerformanceClock implements Clock {\n now(): Time {\n return toTime(performance.now());\n }\n}\n\n/** Clock using Date.now() — fallback for environments without performance API. */\nexport class DateClock implements Clock {\n now(): Time {\n return toTime(Date.now());\n }\n}\n\n/** Manually advanceable clock for deterministic testing. */\nexport class VirtualClock implements Clock {\n private declare time: Time;\n\n constructor(initialTime: Time = toTime(0)) {\n this.time = initialTime;\n }\n\n now(): Time {\n return this.time;\n }\n\n setTime(time: Time): void {\n this.time = time;\n }\n\n advance(ms: number): void {\n this.time = toTime((this.time as number) + ms);\n }\n}\n","/**\n * Binary min-heap for the scheduler's timer queue.\n *\n * Keyed on a numeric priority (scheduled time). Uses a pre-allocated\n * backing array to minimize per-node allocation.\n */\n\nexport interface HeapEntry<T> {\n readonly value: T;\n readonly priority: number;\n /** Internal index for O(log n) removal. Mutated by the heap. */\n index: number;\n}\n\nexport class BinaryHeap<T> {\n private declare items: HeapEntry<T>[];\n\n constructor(initialCapacity = 64) {\n this.items = [];\n // Pre-allocate hint (V8 will grow as needed)\n if (initialCapacity > 0) {\n this.items.length = 0;\n }\n }\n\n get size(): number {\n return this.items.length;\n }\n\n peek(): HeapEntry<T> | undefined {\n return this.items[0];\n }\n\n insert(value: T, priority: number): HeapEntry<T> {\n const entry: HeapEntry<T> = { value, priority, index: this.items.length };\n this.items.push(entry);\n this.siftUp(entry.index);\n return entry;\n }\n\n extractMin(): HeapEntry<T> | undefined {\n if (this.items.length === 0) return undefined;\n const min = this.items[0]!;\n this.removeAt(0);\n return min;\n }\n\n remove(entry: HeapEntry<T>): boolean {\n if (entry.index < 0 || entry.index >= this.items.length) return false;\n if (this.items[entry.index] !== entry) return false;\n this.removeAt(entry.index);\n return true;\n }\n\n private removeAt(index: number): void {\n const last = this.items.length - 1;\n if (index === last) {\n this.items.pop();\n return;\n }\n\n const moved = this.items[last]!;\n this.items[index] = moved;\n moved.index = index;\n this.items.pop();\n\n // Restore heap property\n const parent = (index - 1) >>> 1;\n if (index > 0 && moved.priority < this.items[parent]!.priority) {\n this.siftUp(index);\n } else {\n this.siftDown(index);\n }\n }\n\n private siftUp(index: number): void {\n const item = this.items[index]!;\n while (index > 0) {\n const parentIndex = (index - 1) >>> 1;\n const parent = this.items[parentIndex]!;\n if (item.priority >= parent.priority) break;\n this.items[index] = parent;\n parent.index = index;\n index = parentIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n\n private siftDown(index: number): void {\n const item = this.items[index]!;\n const halfLength = this.items.length >>> 1;\n\n while (index < halfLength) {\n let childIndex = 2 * index + 1;\n let child = this.items[childIndex]!;\n const rightIndex = childIndex + 1;\n\n if (rightIndex < this.items.length && this.items[rightIndex]!.priority < child.priority) {\n childIndex = rightIndex;\n child = this.items[rightIndex]!;\n }\n\n if (item.priority <= child.priority) break;\n\n this.items[index] = child;\n child.index = index;\n index = childIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n}\n","/**\n * DefaultScheduler — production scheduler.\n *\n * Uses a real clock and setTimeout for delayed tasks.\n * Microtask batching: tasks scheduled for \"now\" are flushed\n * in a single queueMicrotask call.\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport type { Clock } from \"./clock.js\";\nimport { PerformanceClock } from \"./clock.js\";\nimport { BinaryHeap, type HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n timerId: ReturnType<typeof setTimeout> | undefined;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class DefaultScheduler implements Scheduler {\n private declare readonly clock: Clock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n private declare microtaskQueued: boolean;\n private declare readonly microtaskBuffer: PendingTask[];\n\n constructor(clock: Clock = new PerformanceClock()) {\n this.clock = clock;\n this.heap = new BinaryHeap();\n this.microtaskQueued = false;\n this.microtaskBuffer = [];\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const now = this.clock.now();\n const time = timeAdd(now, delay);\n const delayMs = delay as number;\n\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n timerId: undefined,\n heapEntry: undefined,\n };\n\n if (delayMs <= 0) {\n // Schedule as microtask\n this.microtaskBuffer.push(pending);\n if (!this.microtaskQueued) {\n this.microtaskQueued = true;\n queueMicrotask(() => this.flushMicrotasks());\n }\n } else {\n // Schedule as setTimeout\n pending.heapEntry = this.heap.insert(pending, time as number);\n pending.timerId = setTimeout(() => {\n if (!pending.cancelled) {\n if (pending.heapEntry) {\n this.heap.remove(pending.heapEntry);\n }\n this.runTask(pending);\n }\n }, delayMs);\n }\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.timerId !== undefined) {\n clearTimeout(pending.timerId);\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n private flushMicrotasks(): void {\n this.microtaskQueued = false;\n const buffer = this.microtaskBuffer.splice(0);\n for (const pending of buffer) {\n if (!pending.cancelled) {\n this.runTask(pending);\n }\n }\n }\n\n private runTask(pending: PendingTask): void {\n try {\n pending.task.run(this.clock.now());\n } catch (err) {\n pending.task.error(this.clock.now(), err);\n }\n }\n}\n\nclass RelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: Scheduler;\n\n constructor(offset: Offset, parent: Scheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n","/**\n * VirtualScheduler — deterministic scheduler for testing.\n *\n * All task execution is synchronous. Time advances only when\n * explicitly told to via advance() / advanceTo() / flush().\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n TIME_ZERO,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport { VirtualClock } from \"./clock.js\";\nimport { BinaryHeap } from \"./heap.js\";\nimport type { HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class VirtualScheduler implements Scheduler {\n private declare readonly clock: VirtualClock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n\n constructor(initialTime: Time = TIME_ZERO) {\n this.clock = new VirtualClock(initialTime);\n this.heap = new BinaryHeap();\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const time = timeAdd(this.clock.now(), delay);\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n heapEntry: undefined,\n };\n pending.heapEntry = this.heap.insert(pending, time as number);\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.heapEntry) {\n // Mark as cancelled; removal from heap happens lazily\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n /** Advance time by a duration, executing all tasks that fall within range. */\n advance(duration: Duration): void {\n const target = timeAdd(this.clock.now(), duration);\n this.advanceTo(target);\n }\n\n /** Advance to an exact time, executing all tasks up to and including that time. */\n advanceTo(time: Time): void {\n while (this.heap.size > 0) {\n const next = this.heap.peek()!;\n if ((next.priority as number) > (time as number)) break;\n this.heap.extractMin();\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n this.clock.setTime(time);\n }\n\n /** Execute all pending tasks regardless of time. */\n flush(): void {\n while (this.heap.size > 0) {\n const next = this.heap.extractMin()!;\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n }\n\n /** Number of pending (non-cancelled) tasks. */\n get pendingCount(): number {\n return this.heap.size;\n }\n}\n\nclass VirtualRelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: VirtualScheduler;\n\n constructor(offset: Offset, parent: VirtualScheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n"],"names":["toTime","ms","timeAdd","t","d","TIME_ZERO","PerformanceClock","now","performance","DateClock","Date","VirtualClock","initialTime","time","setTime","advance","BinaryHeap","initialCapacity","items","length","size","peek","insert","value","priority","entry","index","push","siftUp","extractMin","undefined","min","removeAt","remove","last","pop","moved","parent","siftDown","item","parentIndex","halfLength","childIndex","child","rightIndex","DefaultScheduler","clock","heap","microtaskQueued","microtaskBuffer","currentTime","scheduleTask","delay","task","delayMs","pending","cancelled","timerId","heapEntry","queueMicrotask","flushMicrotasks","setTimeout","runTask","dispose","clearTimeout","relative","offset","RelativeScheduler","cancelTask","st","buffer","splice","run","err","error","VirtualScheduler","VirtualRelativeScheduler","duration","target","advanceTo","next","flush","pendingCount"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../types/dist/index.js","../src/clock.ts","../src/heap.ts","../src/defaultScheduler.ts","../src/virtualScheduler.ts"],"sourcesContent":["/**\n * Branded types for temporal values.\n *\n * Branding prevents accidental mixing of Time, Duration, and Offset\n * at the type level while remaining plain numbers at runtime.\n */ // --- Constructors ---\n/** Wrap a raw millisecond value as a Time. */ const toTime = (ms)=>ms;\n/** Wrap a raw millisecond value as a Duration. */ const toDuration = (ms)=>ms;\n/** Wrap a raw millisecond value as an Offset. */ const toOffset = (ms)=>ms;\n// --- Arithmetic ---\n/** Compute the Duration between two Time points. */ const timeDiff = (a, b)=>a - b;\n/** Advance a Time by a Duration. */ const timeAdd = (t, d)=>t + d;\n/** Advance a Time by an Offset. */ const timeShift = (t, o)=>t + o;\n// --- Constants ---\n/** Time zero — the epoch. */ const TIME_ZERO = 0;\n/** Zero duration. */ const DURATION_ZERO = 0;\n/** Zero offset. */ const OFFSET_ZERO = 0;\n\nexport { DURATION_ZERO, OFFSET_ZERO, TIME_ZERO, timeAdd, timeDiff, timeShift, toDuration, toOffset, toTime };\n//# sourceMappingURL=index.js.map\n","/**\n * Clock abstractions.\n *\n * A Clock is the single source of truth for \"what time is it.\"\n * Different clocks serve different purposes: real time for production,\n * virtual time for testing.\n */\n\nimport { type Time, toTime } from \"aeon-types\";\n\n/** A source of time. */\nexport interface Clock {\n now(): Time;\n}\n\n/** Clock using performance.now() — high-resolution, monotonic. */\nexport class PerformanceClock implements Clock {\n now(): Time {\n return toTime(performance.now());\n }\n}\n\n/** Clock using Date.now() — fallback for environments without performance API. */\nexport class DateClock implements Clock {\n now(): Time {\n return toTime(Date.now());\n }\n}\n\n/** Manually advanceable clock for deterministic testing. */\nexport class VirtualClock implements Clock {\n private declare time: Time;\n\n constructor(initialTime: Time = toTime(0)) {\n this.time = initialTime;\n }\n\n now(): Time {\n return this.time;\n }\n\n setTime(time: Time): void {\n this.time = time;\n }\n\n advance(ms: number): void {\n this.time = toTime((this.time as number) + ms);\n }\n}\n","/**\n * Binary min-heap for the scheduler's timer queue.\n *\n * Keyed on a numeric priority (scheduled time). Uses a pre-allocated\n * backing array to minimize per-node allocation.\n */\n\nexport interface HeapEntry<T> {\n readonly value: T;\n readonly priority: number;\n /** Internal index for O(log n) removal. Mutated by the heap. */\n index: number;\n}\n\nexport class BinaryHeap<T> {\n private declare items: HeapEntry<T>[];\n\n constructor(initialCapacity = 64) {\n this.items = [];\n // Pre-allocate hint (V8 will grow as needed)\n if (initialCapacity > 0) {\n this.items.length = 0;\n }\n }\n\n get size(): number {\n return this.items.length;\n }\n\n peek(): HeapEntry<T> | undefined {\n return this.items[0];\n }\n\n insert(value: T, priority: number): HeapEntry<T> {\n const entry: HeapEntry<T> = { value, priority, index: this.items.length };\n this.items.push(entry);\n this.siftUp(entry.index);\n return entry;\n }\n\n extractMin(): HeapEntry<T> | undefined {\n if (this.items.length === 0) return undefined;\n const min = this.items[0]!;\n this.removeAt(0);\n return min;\n }\n\n remove(entry: HeapEntry<T>): boolean {\n if (entry.index < 0 || entry.index >= this.items.length) return false;\n if (this.items[entry.index] !== entry) return false;\n this.removeAt(entry.index);\n return true;\n }\n\n private removeAt(index: number): void {\n const last = this.items.length - 1;\n if (index === last) {\n this.items.pop();\n return;\n }\n\n const moved = this.items[last]!;\n this.items[index] = moved;\n moved.index = index;\n this.items.pop();\n\n // Restore heap property\n const parent = (index - 1) >>> 1;\n if (index > 0 && moved.priority < this.items[parent]!.priority) {\n this.siftUp(index);\n } else {\n this.siftDown(index);\n }\n }\n\n private siftUp(index: number): void {\n const item = this.items[index]!;\n while (index > 0) {\n const parentIndex = (index - 1) >>> 1;\n const parent = this.items[parentIndex]!;\n if (item.priority >= parent.priority) break;\n this.items[index] = parent;\n parent.index = index;\n index = parentIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n\n private siftDown(index: number): void {\n const item = this.items[index]!;\n const halfLength = this.items.length >>> 1;\n\n while (index < halfLength) {\n let childIndex = 2 * index + 1;\n let child = this.items[childIndex]!;\n const rightIndex = childIndex + 1;\n\n if (rightIndex < this.items.length && this.items[rightIndex]!.priority < child.priority) {\n childIndex = rightIndex;\n child = this.items[rightIndex]!;\n }\n\n if (item.priority <= child.priority) break;\n\n this.items[index] = child;\n child.index = index;\n index = childIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n}\n","/**\n * DefaultScheduler — production scheduler.\n *\n * Uses a real clock and setTimeout for delayed tasks.\n * Microtask batching: tasks scheduled for \"now\" are flushed\n * in a single queueMicrotask call.\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport type { Clock } from \"./clock.js\";\nimport { PerformanceClock } from \"./clock.js\";\nimport { BinaryHeap, type HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n timerId: ReturnType<typeof setTimeout> | undefined;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class DefaultScheduler implements Scheduler {\n private declare readonly clock: Clock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n private declare microtaskQueued: boolean;\n private declare readonly microtaskBuffer: PendingTask[];\n\n constructor(clock: Clock = new PerformanceClock()) {\n this.clock = clock;\n this.heap = new BinaryHeap();\n this.microtaskQueued = false;\n this.microtaskBuffer = [];\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const now = this.clock.now();\n const time = timeAdd(now, delay);\n const delayMs = delay as number;\n\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n timerId: undefined,\n heapEntry: undefined,\n };\n\n if (delayMs <= 0) {\n // Schedule as microtask\n this.microtaskBuffer.push(pending);\n if (!this.microtaskQueued) {\n this.microtaskQueued = true;\n queueMicrotask(() => this.flushMicrotasks());\n }\n } else {\n // Schedule as setTimeout\n pending.heapEntry = this.heap.insert(pending, time as number);\n pending.timerId = setTimeout(() => {\n if (!pending.cancelled) {\n if (pending.heapEntry) {\n this.heap.remove(pending.heapEntry);\n }\n this.runTask(pending);\n }\n }, delayMs);\n }\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.timerId !== undefined) {\n clearTimeout(pending.timerId);\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n private flushMicrotasks(): void {\n this.microtaskQueued = false;\n const buffer = this.microtaskBuffer.splice(0);\n for (const pending of buffer) {\n if (!pending.cancelled) {\n this.runTask(pending);\n }\n }\n }\n\n private runTask(pending: PendingTask): void {\n try {\n pending.task.run(this.clock.now());\n } catch (err) {\n pending.task.error(this.clock.now(), err);\n }\n }\n}\n\nclass RelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: Scheduler;\n\n constructor(offset: Offset, parent: Scheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n","/**\n * VirtualScheduler — deterministic scheduler for testing.\n *\n * All task execution is synchronous. Time advances only when\n * explicitly told to via advance() / advanceTo() / flush().\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n TIME_ZERO,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport { VirtualClock } from \"./clock.js\";\nimport { BinaryHeap } from \"./heap.js\";\nimport type { HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class VirtualScheduler implements Scheduler {\n private declare readonly clock: VirtualClock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n\n constructor(initialTime: Time = TIME_ZERO) {\n this.clock = new VirtualClock(initialTime);\n this.heap = new BinaryHeap();\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const time = timeAdd(this.clock.now(), delay);\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n heapEntry: undefined,\n };\n pending.heapEntry = this.heap.insert(pending, time as number);\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.heapEntry) {\n // Mark as cancelled; removal from heap happens lazily\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n /** Advance time by a duration, executing all tasks that fall within range. */\n advance(duration: Duration): void {\n const target = timeAdd(this.clock.now(), duration);\n this.advanceTo(target);\n }\n\n /** Advance to an exact time, executing all tasks up to and including that time. */\n advanceTo(time: Time): void {\n while (this.heap.size > 0) {\n const next = this.heap.peek()!;\n if ((next.priority as number) > (time as number)) break;\n this.heap.extractMin();\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n this.clock.setTime(time);\n }\n\n /** Execute all pending tasks regardless of time. */\n flush(): void {\n while (this.heap.size > 0) {\n const next = this.heap.extractMin()!;\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n }\n\n /** Number of pending (non-cancelled) tasks. */\n get pendingCount(): number {\n return this.heap.size;\n }\n}\n\nclass VirtualRelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: VirtualScheduler;\n\n constructor(offset: Offset, parent: VirtualScheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n"],"names":["toTime","ms","timeAdd","t","d","TIME_ZERO","PerformanceClock","now","performance","DateClock","Date","VirtualClock","initialTime","time","setTime","advance","BinaryHeap","initialCapacity","items","length","size","peek","insert","value","priority","entry","index","push","siftUp","extractMin","undefined","min","removeAt","remove","last","pop","moved","parent","siftDown","item","parentIndex","halfLength","childIndex","child","rightIndex","DefaultScheduler","clock","heap","microtaskQueued","microtaskBuffer","currentTime","scheduleTask","delay","task","delayMs","pending","cancelled","timerId","heapEntry","queueMicrotask","flushMicrotasks","setTimeout","runTask","dispose","clearTimeout","relative","offset","RelativeScheduler","cancelTask","st","buffer","splice","run","err","error","VirtualScheduler","VirtualRelativeScheduler","duration","target","advanceTo","next","flush","pendingCount"],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../types/dist/index.js","../src/clock.ts","../src/heap.ts","../src/defaultScheduler.ts","../src/virtualScheduler.ts"],"sourcesContent":["/**\n * Branded types for temporal values.\n *\n * Branding prevents accidental mixing of Time, Duration, and Offset\n * at the type level while remaining plain numbers at runtime.\n */ // --- Constructors ---\n/** Wrap a raw millisecond value as a Time. */ const toTime = (ms)=>ms;\n/** Wrap a raw millisecond value as a Duration. */ const toDuration = (ms)=>ms;\n/** Wrap a raw millisecond value as an Offset. */ const toOffset = (ms)=>ms;\n// --- Arithmetic ---\n/** Compute the Duration between two Time points. */ const timeDiff = (a, b)=>a - b;\n/** Advance a Time by a Duration. */ const timeAdd = (t, d)=>t + d;\n/** Advance a Time by an Offset. */ const timeShift = (t, o)=>t + o;\n// --- Constants ---\n/** Time zero — the epoch. */ const TIME_ZERO = 0;\n/** Zero duration. */ const DURATION_ZERO = 0;\n/** Zero offset. */ const OFFSET_ZERO = 0;\n\n/**\n * Higher-Kinded Type encoding via URI-indexed Kind map.\n *\n * Uses module augmentation (Effect-TS / fp-ts style) so that each\n * package can register its own types without circular imports.\n */ // biome-ignore lint/suspicious/noEmptyInterface: open for module augmentation\n// --- Derived combinators ---\n/** Lift a binary function over two Applicative values. */ const liftA2 = (A)=>(f, fa1, fa2)=>A.ap(A.map((a1)=>(a2)=>f(a1, a2), fa1), fa2);\n/** Lift a ternary function over three Applicative values. */ const liftA3 = (A)=>(f, fa1, fa2, fa3)=>A.ap(A.ap(A.map((a1)=>(a2)=>(a3)=>f(a1, a2, a3), fa1), fa2), fa3);\n\n/**\n * Core runtime interfaces for the push/pull reactive system.\n *\n * These define the contracts that packages/core and packages/scheduler implement.\n * Denotational meanings are stated in JSDoc.\n */ // --- URI constants for HKT registration ---\nconst EventURI = \"Event\";\nconst BehaviorURI = \"Behavior\";\n\nexport { BehaviorURI, DURATION_ZERO, EventURI, OFFSET_ZERO, TIME_ZERO, liftA2, liftA3, timeAdd, timeDiff, timeShift, toDuration, toOffset, toTime };\n//# sourceMappingURL=index.js.map\n","/**\n * Clock abstractions.\n *\n * A Clock is the single source of truth for \"what time is it.\"\n * Different clocks serve different purposes: real time for production,\n * virtual time for testing.\n */\n\nimport { type Time, toTime } from \"aeon-types\";\n\n/** A source of time. */\nexport interface Clock {\n now(): Time;\n}\n\n/** Clock using performance.now() — high-resolution, monotonic. */\nexport class PerformanceClock implements Clock {\n now(): Time {\n return toTime(performance.now());\n }\n}\n\n/** Clock using Date.now() — fallback for environments without performance API. */\nexport class DateClock implements Clock {\n now(): Time {\n return toTime(Date.now());\n }\n}\n\n/** Manually advanceable clock for deterministic testing. */\nexport class VirtualClock implements Clock {\n private declare time: Time;\n\n constructor(initialTime: Time = toTime(0)) {\n this.time = initialTime;\n }\n\n now(): Time {\n return this.time;\n }\n\n setTime(time: Time): void {\n this.time = time;\n }\n\n advance(ms: number): void {\n this.time = toTime((this.time as number) + ms);\n }\n}\n","/**\n * Binary min-heap for the scheduler's timer queue.\n *\n * Keyed on a numeric priority (scheduled time). Uses a pre-allocated\n * backing array to minimize per-node allocation.\n */\n\nexport interface HeapEntry<T> {\n readonly value: T;\n readonly priority: number;\n /** Internal index for O(log n) removal. Mutated by the heap. */\n index: number;\n}\n\nexport class BinaryHeap<T> {\n private declare items: HeapEntry<T>[];\n\n constructor(initialCapacity = 64) {\n this.items = [];\n // Pre-allocate hint (V8 will grow as needed)\n if (initialCapacity > 0) {\n this.items.length = 0;\n }\n }\n\n get size(): number {\n return this.items.length;\n }\n\n peek(): HeapEntry<T> | undefined {\n return this.items[0];\n }\n\n insert(value: T, priority: number): HeapEntry<T> {\n const entry: HeapEntry<T> = { value, priority, index: this.items.length };\n this.items.push(entry);\n this.siftUp(entry.index);\n return entry;\n }\n\n extractMin(): HeapEntry<T> | undefined {\n if (this.items.length === 0) return undefined;\n const min = this.items[0]!;\n this.removeAt(0);\n return min;\n }\n\n remove(entry: HeapEntry<T>): boolean {\n if (entry.index < 0 || entry.index >= this.items.length) return false;\n if (this.items[entry.index] !== entry) return false;\n this.removeAt(entry.index);\n return true;\n }\n\n private removeAt(index: number): void {\n const last = this.items.length - 1;\n if (index === last) {\n this.items.pop();\n return;\n }\n\n const moved = this.items[last]!;\n this.items[index] = moved;\n moved.index = index;\n this.items.pop();\n\n // Restore heap property\n const parent = (index - 1) >>> 1;\n if (index > 0 && moved.priority < this.items[parent]!.priority) {\n this.siftUp(index);\n } else {\n this.siftDown(index);\n }\n }\n\n private siftUp(index: number): void {\n const item = this.items[index]!;\n while (index > 0) {\n const parentIndex = (index - 1) >>> 1;\n const parent = this.items[parentIndex]!;\n if (item.priority >= parent.priority) break;\n this.items[index] = parent;\n parent.index = index;\n index = parentIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n\n private siftDown(index: number): void {\n const item = this.items[index]!;\n const halfLength = this.items.length >>> 1;\n\n while (index < halfLength) {\n let childIndex = 2 * index + 1;\n let child = this.items[childIndex]!;\n const rightIndex = childIndex + 1;\n\n if (rightIndex < this.items.length && this.items[rightIndex]!.priority < child.priority) {\n childIndex = rightIndex;\n child = this.items[rightIndex]!;\n }\n\n if (item.priority <= child.priority) break;\n\n this.items[index] = child;\n child.index = index;\n index = childIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n}\n","/**\n * DefaultScheduler — production scheduler.\n *\n * Uses a real clock and setTimeout for delayed tasks.\n * Microtask batching: tasks scheduled for \"now\" are flushed\n * in a single queueMicrotask call.\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport type { Clock } from \"./clock.js\";\nimport { PerformanceClock } from \"./clock.js\";\nimport { BinaryHeap, type HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n timerId: ReturnType<typeof setTimeout> | undefined;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class DefaultScheduler implements Scheduler {\n private declare readonly clock: Clock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n private declare microtaskQueued: boolean;\n private declare readonly microtaskBuffer: PendingTask[];\n\n constructor(clock: Clock = new PerformanceClock()) {\n this.clock = clock;\n this.heap = new BinaryHeap();\n this.microtaskQueued = false;\n this.microtaskBuffer = [];\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const now = this.clock.now();\n const time = timeAdd(now, delay);\n const delayMs = delay as number;\n\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n timerId: undefined,\n heapEntry: undefined,\n };\n\n if (delayMs <= 0) {\n // Schedule as microtask\n this.microtaskBuffer.push(pending);\n if (!this.microtaskQueued) {\n this.microtaskQueued = true;\n queueMicrotask(() => this.flushMicrotasks());\n }\n } else {\n // Schedule as setTimeout\n pending.heapEntry = this.heap.insert(pending, time as number);\n pending.timerId = setTimeout(() => {\n if (!pending.cancelled) {\n if (pending.heapEntry) {\n this.heap.remove(pending.heapEntry);\n }\n this.runTask(pending);\n }\n }, delayMs);\n }\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.timerId !== undefined) {\n clearTimeout(pending.timerId);\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n private flushMicrotasks(): void {\n this.microtaskQueued = false;\n const buffer = this.microtaskBuffer.splice(0);\n for (const pending of buffer) {\n if (!pending.cancelled) {\n this.runTask(pending);\n }\n }\n }\n\n private runTask(pending: PendingTask): void {\n try {\n pending.task.run(this.clock.now());\n } catch (err) {\n pending.task.error(this.clock.now(), err);\n }\n }\n}\n\nclass RelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: Scheduler;\n\n constructor(offset: Offset, parent: Scheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n","/**\n * VirtualScheduler — deterministic scheduler for testing.\n *\n * All task execution is synchronous. Time advances only when\n * explicitly told to via advance() / advanceTo() / flush().\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n TIME_ZERO,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport { VirtualClock } from \"./clock.js\";\nimport { BinaryHeap } from \"./heap.js\";\nimport type { HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class VirtualScheduler implements Scheduler {\n private declare readonly clock: VirtualClock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n\n constructor(initialTime: Time = TIME_ZERO) {\n this.clock = new VirtualClock(initialTime);\n this.heap = new BinaryHeap();\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const time = timeAdd(this.clock.now(), delay);\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n heapEntry: undefined,\n };\n pending.heapEntry = this.heap.insert(pending, time as number);\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.heapEntry) {\n // Mark as cancelled; removal from heap happens lazily\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n /** Advance time by a duration, executing all tasks that fall within range. */\n advance(duration: Duration): void {\n const target = timeAdd(this.clock.now(), duration);\n this.advanceTo(target);\n }\n\n /** Advance to an exact time, executing all tasks up to and including that time. */\n advanceTo(time: Time): void {\n while (this.heap.size > 0) {\n const next = this.heap.peek()!;\n if ((next.priority as number) > (time as number)) break;\n this.heap.extractMin();\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n this.clock.setTime(time);\n }\n\n /** Execute all pending tasks regardless of time. */\n flush(): void {\n while (this.heap.size > 0) {\n const next = this.heap.extractMin()!;\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n }\n\n /** Number of pending (non-cancelled) tasks. */\n get pendingCount(): number {\n return this.heap.size;\n }\n}\n\nclass VirtualRelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: VirtualScheduler;\n\n constructor(offset: Offset, parent: VirtualScheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n"],"names":["toTime","ms","timeAdd","t","d","TIME_ZERO","PerformanceClock","now","performance","DateClock","Date","VirtualClock","initialTime","time","setTime","advance","BinaryHeap","initialCapacity","items","length","size","peek","insert","value","priority","entry","index","push","siftUp","extractMin","undefined","min","removeAt","remove","last","pop","moved","parent","siftDown","item","parentIndex","halfLength","childIndex","child","rightIndex","DefaultScheduler","clock","heap","microtaskQueued","microtaskBuffer","currentTime","scheduleTask","delay","task","delayMs","pending","cancelled","timerId","heapEntry","queueMicrotask","flushMicrotasks","setTimeout","runTask","dispose","clearTimeout","relative","offset","RelativeScheduler","cancelTask","st","buffer","splice","run","err","error","VirtualScheduler","VirtualRelativeScheduler","duration","target","advanceTo","next","flush","pendingCount"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../types/dist/index.js","../src/clock.ts","../src/heap.ts","../src/defaultScheduler.ts","../src/virtualScheduler.ts"],"sourcesContent":["/**\n * Branded types for temporal values.\n *\n * Branding prevents accidental mixing of Time, Duration, and Offset\n * at the type level while remaining plain numbers at runtime.\n */ // --- Constructors ---\n/** Wrap a raw millisecond value as a Time. */ const toTime = (ms)=>ms;\n/** Wrap a raw millisecond value as a Duration. */ const toDuration = (ms)=>ms;\n/** Wrap a raw millisecond value as an Offset. */ const toOffset = (ms)=>ms;\n// --- Arithmetic ---\n/** Compute the Duration between two Time points. */ const timeDiff = (a, b)=>a - b;\n/** Advance a Time by a Duration. */ const timeAdd = (t, d)=>t + d;\n/** Advance a Time by an Offset. */ const timeShift = (t, o)=>t + o;\n// --- Constants ---\n/** Time zero — the epoch. */ const TIME_ZERO = 0;\n/** Zero duration. */ const DURATION_ZERO = 0;\n/** Zero offset. */ const OFFSET_ZERO = 0;\n\nexport { DURATION_ZERO, OFFSET_ZERO, TIME_ZERO, timeAdd, timeDiff, timeShift, toDuration, toOffset, toTime };\n//# sourceMappingURL=index.js.map\n","/**\n * Clock abstractions.\n *\n * A Clock is the single source of truth for \"what time is it.\"\n * Different clocks serve different purposes: real time for production,\n * virtual time for testing.\n */\n\nimport { type Time, toTime } from \"aeon-types\";\n\n/** A source of time. */\nexport interface Clock {\n now(): Time;\n}\n\n/** Clock using performance.now() — high-resolution, monotonic. */\nexport class PerformanceClock implements Clock {\n now(): Time {\n return toTime(performance.now());\n }\n}\n\n/** Clock using Date.now() — fallback for environments without performance API. */\nexport class DateClock implements Clock {\n now(): Time {\n return toTime(Date.now());\n }\n}\n\n/** Manually advanceable clock for deterministic testing. */\nexport class VirtualClock implements Clock {\n private declare time: Time;\n\n constructor(initialTime: Time = toTime(0)) {\n this.time = initialTime;\n }\n\n now(): Time {\n return this.time;\n }\n\n setTime(time: Time): void {\n this.time = time;\n }\n\n advance(ms: number): void {\n this.time = toTime((this.time as number) + ms);\n }\n}\n","/**\n * Binary min-heap for the scheduler's timer queue.\n *\n * Keyed on a numeric priority (scheduled time). Uses a pre-allocated\n * backing array to minimize per-node allocation.\n */\n\nexport interface HeapEntry<T> {\n readonly value: T;\n readonly priority: number;\n /** Internal index for O(log n) removal. Mutated by the heap. */\n index: number;\n}\n\nexport class BinaryHeap<T> {\n private declare items: HeapEntry<T>[];\n\n constructor(initialCapacity = 64) {\n this.items = [];\n // Pre-allocate hint (V8 will grow as needed)\n if (initialCapacity > 0) {\n this.items.length = 0;\n }\n }\n\n get size(): number {\n return this.items.length;\n }\n\n peek(): HeapEntry<T> | undefined {\n return this.items[0];\n }\n\n insert(value: T, priority: number): HeapEntry<T> {\n const entry: HeapEntry<T> = { value, priority, index: this.items.length };\n this.items.push(entry);\n this.siftUp(entry.index);\n return entry;\n }\n\n extractMin(): HeapEntry<T> | undefined {\n if (this.items.length === 0) return undefined;\n const min = this.items[0]!;\n this.removeAt(0);\n return min;\n }\n\n remove(entry: HeapEntry<T>): boolean {\n if (entry.index < 0 || entry.index >= this.items.length) return false;\n if (this.items[entry.index] !== entry) return false;\n this.removeAt(entry.index);\n return true;\n }\n\n private removeAt(index: number): void {\n const last = this.items.length - 1;\n if (index === last) {\n this.items.pop();\n return;\n }\n\n const moved = this.items[last]!;\n this.items[index] = moved;\n moved.index = index;\n this.items.pop();\n\n // Restore heap property\n const parent = (index - 1) >>> 1;\n if (index > 0 && moved.priority < this.items[parent]!.priority) {\n this.siftUp(index);\n } else {\n this.siftDown(index);\n }\n }\n\n private siftUp(index: number): void {\n const item = this.items[index]!;\n while (index > 0) {\n const parentIndex = (index - 1) >>> 1;\n const parent = this.items[parentIndex]!;\n if (item.priority >= parent.priority) break;\n this.items[index] = parent;\n parent.index = index;\n index = parentIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n\n private siftDown(index: number): void {\n const item = this.items[index]!;\n const halfLength = this.items.length >>> 1;\n\n while (index < halfLength) {\n let childIndex = 2 * index + 1;\n let child = this.items[childIndex]!;\n const rightIndex = childIndex + 1;\n\n if (rightIndex < this.items.length && this.items[rightIndex]!.priority < child.priority) {\n childIndex = rightIndex;\n child = this.items[rightIndex]!;\n }\n\n if (item.priority <= child.priority) break;\n\n this.items[index] = child;\n child.index = index;\n index = childIndex;\n }\n this.items[index] = item;\n item.index = index;\n }\n}\n","/**\n * DefaultScheduler — production scheduler.\n *\n * Uses a real clock and setTimeout for delayed tasks.\n * Microtask batching: tasks scheduled for \"now\" are flushed\n * in a single queueMicrotask call.\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport type { Clock } from \"./clock.js\";\nimport { PerformanceClock } from \"./clock.js\";\nimport { BinaryHeap, type HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n timerId: ReturnType<typeof setTimeout> | undefined;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class DefaultScheduler implements Scheduler {\n private declare readonly clock: Clock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n private declare microtaskQueued: boolean;\n private declare readonly microtaskBuffer: PendingTask[];\n\n constructor(clock: Clock = new PerformanceClock()) {\n this.clock = clock;\n this.heap = new BinaryHeap();\n this.microtaskQueued = false;\n this.microtaskBuffer = [];\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const now = this.clock.now();\n const time = timeAdd(now, delay);\n const delayMs = delay as number;\n\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n timerId: undefined,\n heapEntry: undefined,\n };\n\n if (delayMs <= 0) {\n // Schedule as microtask\n this.microtaskBuffer.push(pending);\n if (!this.microtaskQueued) {\n this.microtaskQueued = true;\n queueMicrotask(() => this.flushMicrotasks());\n }\n } else {\n // Schedule as setTimeout\n pending.heapEntry = this.heap.insert(pending, time as number);\n pending.timerId = setTimeout(() => {\n if (!pending.cancelled) {\n if (pending.heapEntry) {\n this.heap.remove(pending.heapEntry);\n }\n this.runTask(pending);\n }\n }, delayMs);\n }\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.timerId !== undefined) {\n clearTimeout(pending.timerId);\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n private flushMicrotasks(): void {\n this.microtaskQueued = false;\n const buffer = this.microtaskBuffer.splice(0);\n for (const pending of buffer) {\n if (!pending.cancelled) {\n this.runTask(pending);\n }\n }\n }\n\n private runTask(pending: PendingTask): void {\n try {\n pending.task.run(this.clock.now());\n } catch (err) {\n pending.task.error(this.clock.now(), err);\n }\n }\n}\n\nclass RelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: Scheduler;\n\n constructor(offset: Offset, parent: Scheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new RelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n","/**\n * VirtualScheduler — deterministic scheduler for testing.\n *\n * All task execution is synchronous. Time advances only when\n * explicitly told to via advance() / advanceTo() / flush().\n */\n\nimport {\n type Duration,\n type Offset,\n type ScheduledTask,\n type Scheduler,\n TIME_ZERO,\n type Task,\n type Time,\n timeAdd,\n toTime,\n} from \"aeon-types\";\nimport { VirtualClock } from \"./clock.js\";\nimport { BinaryHeap } from \"./heap.js\";\nimport type { HeapEntry } from \"./heap.js\";\n\ninterface PendingTask {\n readonly task: Task;\n readonly time: Time;\n cancelled: boolean;\n heapEntry: HeapEntry<PendingTask> | undefined;\n}\n\nexport class VirtualScheduler implements Scheduler {\n private declare readonly clock: VirtualClock;\n private declare readonly heap: BinaryHeap<PendingTask>;\n\n constructor(initialTime: Time = TIME_ZERO) {\n this.clock = new VirtualClock(initialTime);\n this.heap = new BinaryHeap();\n }\n\n currentTime(): Time {\n return this.clock.now();\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n const time = timeAdd(this.clock.now(), delay);\n const pending: PendingTask = {\n task,\n time,\n cancelled: false,\n heapEntry: undefined,\n };\n pending.heapEntry = this.heap.insert(pending, time as number);\n\n return {\n task,\n time,\n dispose() {\n if (!pending.cancelled) {\n pending.cancelled = true;\n if (pending.heapEntry) {\n // Mark as cancelled; removal from heap happens lazily\n }\n }\n },\n };\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(offset, this);\n }\n\n cancelTask(st: ScheduledTask): void {\n st.dispose();\n }\n\n /** Advance time by a duration, executing all tasks that fall within range. */\n advance(duration: Duration): void {\n const target = timeAdd(this.clock.now(), duration);\n this.advanceTo(target);\n }\n\n /** Advance to an exact time, executing all tasks up to and including that time. */\n advanceTo(time: Time): void {\n while (this.heap.size > 0) {\n const next = this.heap.peek()!;\n if ((next.priority as number) > (time as number)) break;\n this.heap.extractMin();\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n this.clock.setTime(time);\n }\n\n /** Execute all pending tasks regardless of time. */\n flush(): void {\n while (this.heap.size > 0) {\n const next = this.heap.extractMin()!;\n const pending = next.value;\n if (!pending.cancelled) {\n this.clock.setTime(pending.time);\n try {\n pending.task.run(pending.time);\n } catch (err) {\n pending.task.error(pending.time, err);\n }\n }\n }\n }\n\n /** Number of pending (non-cancelled) tasks. */\n get pendingCount(): number {\n return this.heap.size;\n }\n}\n\nclass VirtualRelativeScheduler implements Scheduler {\n private declare readonly offset: Offset;\n private declare readonly parent: VirtualScheduler;\n\n constructor(offset: Offset, parent: VirtualScheduler) {\n this.offset = offset;\n this.parent = parent;\n }\n\n currentTime(): Time {\n return toTime((this.parent.currentTime() as number) + (this.offset as number));\n }\n\n scheduleTask(delay: Duration, task: Task): ScheduledTask {\n return this.parent.scheduleTask(delay, task);\n }\n\n relative(offset: Offset): Scheduler {\n return new VirtualRelativeScheduler(\n toTime((this.offset as number) + (offset as number)) as unknown as Offset,\n this.parent,\n );\n }\n\n cancelTask(st: ScheduledTask): void {\n this.parent.cancelTask(st);\n }\n}\n"],"names":["toTime","ms","timeAdd","t","d","TIME_ZERO","PerformanceClock","now","performance","DateClock","Date","VirtualClock","initialTime","time","setTime","advance","BinaryHeap","initialCapacity","items","length","size","peek","insert","value","priority","entry","index","push","siftUp","extractMin","undefined","min","removeAt","remove","last","pop","moved","parent","siftDown","item","parentIndex","halfLength","childIndex","child","rightIndex","DefaultScheduler","clock","heap","microtaskQueued","microtaskBuffer","currentTime","scheduleTask","delay","task","delayMs","pending","cancelled","timerId","heapEntry","queueMicrotask","flushMicrotasks","setTimeout","runTask","dispose","clearTimeout","relative","offset","RelativeScheduler","cancelTask","st","buffer","splice","run","err","error","VirtualScheduler","VirtualRelativeScheduler","duration","target","advanceTo","next","flush","pendingCount"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aeon-scheduler",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Scheduler implementations for Aeon reactive streams",
5
5
  "license": "MIT",
6
6
  "author": "Josh Burgess",
@@ -38,7 +38,7 @@
38
38
  "dist"
39
39
  ],
40
40
  "dependencies": {
41
- "aeon-types": "0.1.1"
41
+ "aeon-types": "0.2.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "typescript": "^5.7.2"