123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- const Op_1 = require("./Op");
- class Iterator {
- constructor(ops) {
- this.ops = ops;
- this.index = 0;
- this.offset = 0;
- }
- hasNext() {
- return this.peekLength() < Infinity;
- }
- next(length) {
- if (!length) {
- length = Infinity;
- }
- const nextOp = this.ops[this.index];
- if (nextOp) {
- const offset = this.offset;
- const opLength = Op_1.default.length(nextOp);
- if (length >= opLength - offset) {
- length = opLength - offset;
- this.index += 1;
- this.offset = 0;
- }
- else {
- this.offset += length;
- }
- if (typeof nextOp.delete === 'number') {
- return { delete: length };
- }
- else {
- const retOp = {};
- if (nextOp.attributes) {
- retOp.attributes = nextOp.attributes;
- }
- if (typeof nextOp.retain === 'number') {
- retOp.retain = length;
- }
- else if (typeof nextOp.retain === 'object' &&
- nextOp.retain !== null) {
- // offset should === 0, length should === 1
- retOp.retain = nextOp.retain;
- }
- else if (typeof nextOp.insert === 'string') {
- retOp.insert = nextOp.insert.substr(offset, length);
- }
- else {
- // offset should === 0, length should === 1
- retOp.insert = nextOp.insert;
- }
- return retOp;
- }
- }
- else {
- return { retain: Infinity };
- }
- }
- peek() {
- return this.ops[this.index];
- }
- peekLength() {
- if (this.ops[this.index]) {
- // Should never return 0 if our index is being managed correctly
- return Op_1.default.length(this.ops[this.index]) - this.offset;
- }
- else {
- return Infinity;
- }
- }
- peekType() {
- const op = this.ops[this.index];
- if (op) {
- if (typeof op.delete === 'number') {
- return 'delete';
- }
- else if (typeof op.retain === 'number' ||
- (typeof op.retain === 'object' && op.retain !== null)) {
- return 'retain';
- }
- else {
- return 'insert';
- }
- }
- return 'retain';
- }
- rest() {
- if (!this.hasNext()) {
- return [];
- }
- else if (this.offset === 0) {
- return this.ops.slice(this.index);
- }
- else {
- const offset = this.offset;
- const index = this.index;
- const next = this.next();
- const rest = this.ops.slice(this.index);
- this.offset = offset;
- this.index = index;
- return [next].concat(rest);
- }
- }
- }
- exports.default = Iterator;
- //# sourceMappingURL=OpIterator.js.map
|