export default class { constructor() { this.state = this.awaitingTokenOrComma; this.inProgress = ''; this._rowResults = []; this._results = []; } push(c) { this.state(c); } get results() { return this._results.concat([this._rowResults.concat([this.inProgress])]); } awaitingTokenOrComma(c) { switch (c) { case ',': // empty column this._rowResults.push(''); break; case '\n': this._results.push(this._rowResults); this._rowResults = []; break; default: if (/\s/.test(c)) { return; } this.inProgress += c; this.state = this.awaitingComma; } } awaitingComma(c) { switch (c) { case ',': this._rowResults.push(this.inProgress); this.inProgress = ''; this.state = this.awaitingTokenOrComma; break; case '\r': break; case '\n': this._results.push(this._rowResults.concat(this.inProgress)); this._rowResults = []; this.inProgress = ''; this.state = this.awaitingTokenOrComma; break; case '"': this.state = this.checkForDoubleQuote; break; default: this.inProgress += c; } } checkForDoubleQuote(c) { this.inProgress += c switch (c) { case '"': this.state = this.awaitingComma; break; default: this.state = this.awaitingQuote; } } awaitingQuote(c) { switch (c) { case '"': this.state = this.awaitingComma; break; default: this.inProgress += c; } } }