import {log} from './log.js' import {Lifecycle} from './util/lifecycle.js' import {Input} from './vm/input.js' import {Lexer} from "./vm/lexer.js"; import {Parser} from "./vm/parser.js"; import {commands} from "./vm/commands/index.js"; import {Executor} from "./vm/vm.js"; import {ConsoleDisplay, OutputManager, WlClipboard} from "./vm/output.js"; const lifecycle = new Lifecycle() const input = new Input() input.adoptLifecycle(lifecycle) input.subscribe(line => log.verbose('input', { line })) const lexer = new Lexer(input) lexer.subscribe(token => log.verbose('token', token)) const parser = new Parser(commands, lexer) parser.subscribe(exec => log.verbose('exec', exec)) const output: OutputManager = { display: new ConsoleDisplay, clipboard: new WlClipboard, } const exec = new Executor(output, parser, input) exec.adoptLifecycle(lifecycle) exec.subscribe(state => state.outputSubject()) input.setupPrompt() process.on('SIGINT', () => lifecycle.close())