local Phase = require(script:FindFirstChild("Phase")) :: any local Pipeline = require(script:FindFirstChild("Pipeline")) :: any local Scheduler = require(script:FindFirstChild("Scheduler")) :: any local conditions = require(script:FindFirstChild("conditions")) local utils = require(script:FindFirstChild("utils")) type EventLike = utils.EventLike type EventInstance = utils.EventInstance export type SystemFn = ((U...) -> any) | ((U...) -> ()) export type SystemTable = { system: SystemFn, phase: Phase?, name: string?, runConditions: { (U...) -> boolean }?, [any]: any, } export type System = SystemFn | SystemTable export type Phase = { PreStartup: Phase, Startup: Phase, PostStartup: Phase, new: (debugName: string?) -> Phase, } export type Pipeline = { Startup: Pipeline, insert: (self: Pipeline, phase: Phase) -> Pipeline, insertAfter: (self: Pipeline, phase: Phase, after: Phase) -> Pipeline, new: (debugName: string?) -> Pipeline, } type Plugin = { build: (self: Plugin, scheduler: Scheduler) -> (), cleanup: ((self: Plugin) -> ())?, [any]: any, } export type Scheduler = { addPlugin: (self: Scheduler, plugin: Plugin) -> Scheduler, addSystem: ( self: Scheduler, system: System, phase: Phase? ) -> Scheduler, addSystems: ( self: Scheduler, systems: { System }, phase: Phase? ) -> Scheduler, editSystem: ( self: Scheduler, system: System, new: Phase ) -> Scheduler, replaceSystem: ( self: Scheduler, system: System, new: System ) -> Scheduler, removeSystem: ( self: Scheduler, system: System ) -> Scheduler, addRunCondition: (( self: Scheduler, system: System, fn: (U...) -> boolean, ...any ) -> Scheduler) & (( self: Scheduler, phase: Phase, fn: (U...) -> boolean, ...any ) -> Scheduler) & (( self: Scheduler, pipeline: Pipeline, fn: (U...) -> boolean, ...any ) -> Scheduler), run: ((self: Scheduler, system: System) -> Scheduler) & ((self: Scheduler, phase: Phase) -> Scheduler) & ((self: Scheduler, pipeline: Pipeline) -> Scheduler), runAll: (self: Scheduler) -> Scheduler, getDeltaTime: (self: Scheduler) -> number, insert: ((self: Scheduler, phase: Phase) -> Scheduler) & (( self: Scheduler, pipeline: Pipeline ) -> Scheduler) & (( self: Scheduler, phase: Phase, instance: EventInstance | EventLike, event: string | EventLike ) -> Scheduler) & (( self: Scheduler, Pipeline: Pipeline, instance: EventInstance | EventLike, event: string | EventLike ) -> Scheduler), insertAfter: (( self: Scheduler, phase: Phase, after: Phase | Pipeline ) -> Scheduler) & (( self: Scheduler, pipeline: Pipeline, after: Phase | Pipeline ) -> Scheduler), cleanup: (self: Scheduler) -> (), new: (U...) -> Scheduler, } return { Phase = Phase :: Phase, Pipeline = Pipeline :: Pipeline, Scheduler = Scheduler :: { new: (U...) -> Scheduler, }, isNot = conditions.isNot, runOnce = conditions.runOnce, timePassed = conditions.timePassed, onEvent = conditions.onEvent, }