diff --git a/Writing Programs.md b/Writing Programs.md deleted file mode 100644 index 839fe09..0000000 --- a/Writing Programs.md +++ /dev/null @@ -1,46 +0,0 @@ -Implement the `sl` ("steam locomotive") command from Linux in TypeScript. I want an __exact replica__ of the original Linux command. Strictly follow the following APIs and concepts: -1. class SimpleStream - - on(listener: (data: T) => any): void - - Attaches a listener to the stream - - param listener -> the function to call when data is streamed - - once(listener: (data: T) => any): void - - Attaches a one-time listener to the stream - - param listener -> the function to call when data is streamed - - wait(): Promise - - Patiently waits until new data is streamed, then returns it - - return a promise for a single chunk of streamed data - - off(listener: Function): void - - Removes a listener from the stream - - param listener -> the function to remove - - emit(data: T): void - - Streams data - - param data -> the data to stream -2. Escape codes - - Escape codes can be formatted using one of the following syntaxes: - - `\{code letter}` -> for short codes like \n or \f - - `\0{code id};{first parameter};{second parameter};{...parameters}\0` -> for longer codes with complex parameters like cursor movement codes - - A semicolon right after or before a null terminator (`\0`) inside of an escape code is a syntax error - - Supported escape codes: - - Short codes ( -> ) - 1. n -> line feed (new line) - 2. f -> form feed (new page) - - Longer codes (,,<...parameters> -> ) - 1. cmr,{delta x},{delta y} -> moves the cursor relative to its current position by the specified amounts - 2. cma,{absolute x},{absolute y} -> moves the cursor absolute in the terminal coordinate space - - Example usage: - - `stdout.emit("\\cma;3;2\\")` - sets the cursor position to the specified XY coordinates - x=3, y=2 -2. stdout/stdin - SimpleStream instances - - they function as input/output interfaces to send text between the shell and other programs - - stdout allows for formatting using the above mentioned Escape codes - - Example usage: - - `stdout.emit("Hello world!\n")` - streams the text to the stdout stream, works like printf in C - - ```stdin.once(data => stdout.emit(`Received data: ${data}`))``` - creates a single use listener in the stdin stream and prints out the received data -3. abstract class Program - - abstract Exec(stdin: SimpleStream, stdout: SimpleStream, workdir: Item, args: string[]): Promise - - Entry point for a program - - param stdin -> input stream - - param stdout -> output stream - - param workdir -> Working directory filesystem item - - param args -> arguments array, including the executed program name from the shell - - for example for echo command: `[ "echo", "test", "one", "two", "three" ]` - - returns a posix-like exit code