import { Middleware, MiddlewareFn } from '../middleware' import Composer from '../composer' import Context from '../context' const { compose } = Composer export interface SceneOptions { ttl?: number handlers: ReadonlyArray> enterHandlers: ReadonlyArray> leaveHandlers: ReadonlyArray> } export class BaseScene extends Composer { id: string ttl?: number enterHandler: MiddlewareFn leaveHandler: MiddlewareFn constructor(id: string, options?: SceneOptions) { const opts: SceneOptions = { handlers: [], enterHandlers: [], leaveHandlers: [], ...options, } super(...opts.handlers) this.id = id this.ttl = opts.ttl this.enterHandler = compose(opts.enterHandlers) this.leaveHandler = compose(opts.leaveHandlers) } enter(...fns: Array>) { this.enterHandler = compose([this.enterHandler, ...fns]) return this } leave(...fns: Array>) { this.leaveHandler = compose([this.leaveHandler, ...fns]) return this } enterMiddleware() { return this.enterHandler } leaveMiddleware() { return this.leaveHandler } } export default BaseScene