SafetyVantage Coding Challenge
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

47 lines
1003 B

export class Stream {
private pos: number;
constructor(private data: string) {
this.data = data;
this.pos = 0;
}
get eof() {
return this.pos === this.data.length;
}
peek() {
return this.data.slice(this.pos, this.pos + 1);
}
read() {
const value = this.data[this.pos];
this.pos++;
return value;
}
panic(message: string) {
throw new Error(`Stream Error: ${message}, at position: ${this.pos}`);
}
readSpaces() {
return this.readWhile(" ", "\t");
}
readWhile(...chars: string[]) {
let value = "";
while (!this.eof && chars.includes(this.peek())) {
value += this.read();
}
return value;
}
readUntil(...chars: string[]) {
const nextIndex = chars.reduce((index, chr) => {
const i = this.data.indexOf(chr, this.pos);
return i < index && i != -1 ? i : index;
}, this.data.length - 1);
const value = this.data.substring(this.pos, nextIndex);
this.pos = nextIndex;
return value;
}
}