/* eslint-disable no-return-assign, no-unused-vars, */ // TODO: This file was created by bulk-decaffeinate. // Fix any style issues and re-enable lint. /* * decaffeinate suggestions: * DS101: Remove unnecessary use of Array.from * DS102: Remove unnecessary code created because of implicit returns * DS207: Consider shorter variations of null checks * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md */ // These methods let you build a transform function from a transformComponent function // for OT types like text and JSON in which operations are lists of components // and transforming them requires N^2 work. // Add transform and transformX functions for an OT type which has transformComponent defined. // transformComponent(destination array, component, other component, side) let bootstrapTransform; exports._bt = (bootstrapTransform = function(type, transformComponent, checkValidOp, append) { let transformX; const transformComponentX = function(left, right, destLeft, destRight) { transformComponent(destLeft, left, right, 'left'); return transformComponent(destRight, right, left, 'right'); }; // Transforms rightOp by leftOp. Returns ['rightOp', clientOp'] type.transformX = (type.transformX = (transformX = function(leftOp, rightOp) { checkValidOp(leftOp); checkValidOp(rightOp); const newRightOp = []; for (let rightComponent of Array.from(rightOp)) { // Generate newLeftOp by composing leftOp by rightComponent const newLeftOp = []; let k = 0; while (k < leftOp.length) { var l; const nextC = []; transformComponentX(leftOp[k], rightComponent, newLeftOp, nextC); k++; if (nextC.length === 1) { rightComponent = nextC[0]; } else if (nextC.length === 0) { for (l of Array.from(leftOp.slice(k))) { append(newLeftOp, l); } rightComponent = null; break; } else { // Recurse. const [l_, r_] = Array.from(transformX(leftOp.slice(k), nextC)); for (l of Array.from(l_)) { append(newLeftOp, l); } for (const r of Array.from(r_)) { append(newRightOp, r); } rightComponent = null; break; } } if (rightComponent != null) { append(newRightOp, rightComponent); } leftOp = newLeftOp; } return [leftOp, newRightOp]; })); // Transforms op with specified type ('left' or 'right') by otherOp. return type.transform = (type.transform = function(op, otherOp, type) { let _; if ((type !== 'left') && (type !== 'right')) { throw new Error("type must be 'left' or 'right'"); } if (otherOp.length === 0) { return op; } // TODO: Benchmark with and without this line. I _think_ it'll make a big difference...? if ((op.length === 1) && (otherOp.length === 1)) { return transformComponent([], op[0], otherOp[0], type); } if (type === 'left') { let left; [left, _] = Array.from(transformX(op, otherOp)); return left; } else { let right; [_, right] = Array.from(transformX(otherOp, op)); return right; } }); }); if (typeof WEB === 'undefined') { exports.bootstrapTransform = bootstrapTransform; }