local Phase = require(script.Phase) :: any local Pipeline = require(script.Pipeline) :: any local Scheduler = require(script.Scheduler) :: any local conditions = require(script.conditions) local utils = require(script.utils) type GenericTable = utils.GenericTable type SignalLike = utils.SignalLike type ConnectionLike = utils.ConnectionLike type ConnectFn = utils.ConnectFn type Callback = utils.Callback 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) -> (), [any]: any, } | { 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, dependency: Phase | Pipeline ) -> Scheduler) -- RBXScriptSignal & nil & (( self: Scheduler, dependency: Phase | Pipeline, signal: RBXScriptSignal ) -> Scheduler) -- Instance & RBXScriptSignal -- Instance & string & (( self: Scheduler, dependency: Phase | Pipeline, instance: Instance, event: RBXScriptSignal | string ) -> Scheduler) -- SignalLike & nil & (( self: Scheduler, dependency: Phase | Pipeline, signal: SignalLike ) -> Scheduler) -- table & string & (( self: Scheduler, dependency: Phase | Pipeline, table: GenericTable, event: string ) -> Scheduler) -- table & connectable method & (( self: Scheduler, dependency: Phase | Pipeline, instance: GenericTable, connectMethod: (GenericTable, Callback, ...any) -> T ) -> Scheduler) -- connectable function & (( self: Scheduler, dependency: Phase | Pipeline, connectFn: (Callback, ...any) -> T ) -> Scheduler), insertAfter: (( self: Scheduler, phase: Phase, after: Phase | Pipeline ) -> Scheduler) & (( self: Scheduler, pipeline: Pipeline, after: Phase | Pipeline ) -> Scheduler), insertBefore: (( self: Scheduler, phase: Phase, before: Phase | Pipeline ) -> Scheduler) & (( self: Scheduler, pipeline: Pipeline, before: 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, }