prosemirror-changeset 2.1.0 → 2.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,696 @@
1
+ 'use strict';
2
+
3
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
4
+
5
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+
9
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
10
+
11
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
+
13
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
14
+
15
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
16
+
17
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
18
+
19
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
20
+
21
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
22
+
23
+ Object.defineProperty(exports, '__esModule', {
24
+ value: true
25
+ });
26
+
27
+ function tokens(frag, start, end, target) {
28
+ for (var i = 0, off = 0; i < frag.childCount; i++) {
29
+ var child = frag.child(i),
30
+ endOff = off + child.nodeSize;
31
+ var from = Math.max(off, start),
32
+ to = Math.min(endOff, end);
33
+
34
+ if (from < to) {
35
+ if (child.isText) {
36
+ for (var j = from; j < to; j++) {
37
+ target.push(child.text.charCodeAt(j - off));
38
+ }
39
+ } else if (child.isLeaf) {
40
+ target.push(child.type.name);
41
+ } else {
42
+ if (from == off) target.push(child.type.name);
43
+ tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target);
44
+ if (to == endOff) target.push(-1);
45
+ }
46
+ }
47
+
48
+ off = endOff;
49
+ }
50
+
51
+ return target;
52
+ }
53
+
54
+ var MAX_DIFF_SIZE = 5000;
55
+
56
+ function minUnchanged(sizeA, sizeB) {
57
+ return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)));
58
+ }
59
+
60
+ function computeDiff(fragA, fragB, range) {
61
+ var tokA = tokens(fragA, range.fromA, range.toA, []);
62
+ var tokB = tokens(fragB, range.fromB, range.toB, []);
63
+ var start = 0,
64
+ endA = tokA.length,
65
+ endB = tokB.length;
66
+
67
+ while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) {
68
+ start++;
69
+ }
70
+
71
+ if (start == tokA.length && start == tokB.length) return [];
72
+
73
+ while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) {
74
+ endA--, endB--;
75
+ }
76
+
77
+ if (endA == start || endB == start || endA == endB && endA == start + 1) return [range.slice(start, endA, start, endB)];
78
+ var lenA = endA - start,
79
+ lenB = endB - start;
80
+ var max = Math.min(MAX_DIFF_SIZE, lenA + lenB),
81
+ off = max + 1;
82
+ var history = [];
83
+ var frontier = [];
84
+
85
+ for (var len = off * 2, i = 0; i < len; i++) {
86
+ frontier[i] = -1;
87
+ }
88
+
89
+ for (var size = 0; size <= max; size++) {
90
+ for (var diag = -size; diag <= size; diag += 2) {
91
+ var next = frontier[diag + 1 + max],
92
+ prev = frontier[diag - 1 + max];
93
+ var x = next < prev ? prev : next + 1,
94
+ y = x + diag;
95
+
96
+ while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) {
97
+ x++, y++;
98
+ }
99
+
100
+ frontier[diag + max] = x;
101
+
102
+ if (x >= lenA && y >= lenB) {
103
+ var _ret = function () {
104
+ var diff = [],
105
+ minSpan = minUnchanged(endA - start, endB - start);
106
+ var fromA = -1,
107
+ toA = -1,
108
+ fromB = -1,
109
+ toB = -1;
110
+
111
+ var add = function add(fA, tA, fB, tB) {
112
+ if (fromA > -1 && fromA < tA + minSpan) {
113
+ fromA = fA;
114
+ fromB = fB;
115
+ } else {
116
+ if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB));
117
+ fromA = fA;
118
+ toA = tA;
119
+ fromB = fB;
120
+ toB = tB;
121
+ }
122
+ };
123
+
124
+ for (var _i = size - 1; _i >= 0; _i--) {
125
+ var _next = frontier[diag + 1 + max],
126
+ _prev = frontier[diag - 1 + max];
127
+
128
+ if (_next < _prev) {
129
+ diag--;
130
+ x = _prev + start;
131
+ y = x + diag;
132
+ add(x, x, y, y + 1);
133
+ } else {
134
+ diag++;
135
+ x = _next + start;
136
+ y = x + diag;
137
+ add(x, x + 1, y, y);
138
+ }
139
+
140
+ frontier = history[_i >> 1];
141
+ }
142
+
143
+ if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB));
144
+ return {
145
+ v: diff.reverse()
146
+ };
147
+ }();
148
+
149
+ if (_typeof(_ret) === "object") return _ret.v;
150
+ }
151
+ }
152
+
153
+ if (size % 2 == 0) history.push(frontier.slice());
154
+ }
155
+
156
+ return [range.slice(start, endA, start, endB)];
157
+ }
158
+
159
+ var Span = function () {
160
+ function Span(length, data) {
161
+ _classCallCheck(this, Span);
162
+
163
+ this.length = length;
164
+ this.data = data;
165
+ }
166
+
167
+ _createClass(Span, [{
168
+ key: "cut",
169
+ value: function cut(length) {
170
+ return length == this.length ? this : new Span(length, this.data);
171
+ }
172
+ }], [{
173
+ key: "slice",
174
+ value: function slice(spans, from, to) {
175
+ if (from == to) return Span.none;
176
+ if (from == 0 && to == Span.len(spans)) return spans;
177
+ var result = [];
178
+
179
+ for (var i = 0, off = 0; off < to; i++) {
180
+ var span = spans[i],
181
+ end = off + span.length;
182
+ var overlap = Math.min(to, end) - Math.max(from, off);
183
+ if (overlap > 0) result.push(span.cut(overlap));
184
+ off = end;
185
+ }
186
+
187
+ return result;
188
+ }
189
+ }, {
190
+ key: "join",
191
+ value: function join(a, b, combine) {
192
+ if (a.length == 0) return b;
193
+ if (b.length == 0) return a;
194
+ var combined = combine(a[a.length - 1].data, b[0].data);
195
+ if (combined == null) return a.concat(b);
196
+ var result = a.slice(0, a.length - 1);
197
+ result.push(new Span(a[a.length - 1].length + b[0].length, combined));
198
+
199
+ for (var i = 1; i < b.length; i++) {
200
+ result.push(b[i]);
201
+ }
202
+
203
+ return result;
204
+ }
205
+ }, {
206
+ key: "len",
207
+ value: function len(spans) {
208
+ var len = 0;
209
+
210
+ for (var i = 0; i < spans.length; i++) {
211
+ len += spans[i].length;
212
+ }
213
+
214
+ return len;
215
+ }
216
+ }]);
217
+
218
+ return Span;
219
+ }();
220
+
221
+ Span.none = [];
222
+
223
+ var Change = function () {
224
+ function Change(fromA, toA, fromB, toB, deleted, inserted) {
225
+ _classCallCheck(this, Change);
226
+
227
+ this.fromA = fromA;
228
+ this.toA = toA;
229
+ this.fromB = fromB;
230
+ this.toB = toB;
231
+ this.deleted = deleted;
232
+ this.inserted = inserted;
233
+ }
234
+
235
+ _createClass(Change, [{
236
+ key: "lenA",
237
+ get: function get() {
238
+ return this.toA - this.fromA;
239
+ }
240
+ }, {
241
+ key: "lenB",
242
+ get: function get() {
243
+ return this.toB - this.fromB;
244
+ }
245
+ }, {
246
+ key: "slice",
247
+ value: function slice(startA, endA, startB, endB) {
248
+ if (startA == 0 && startB == 0 && endA == this.toA - this.fromA && endB == this.toB - this.fromB) return this;
249
+ return new Change(this.fromA + startA, this.fromA + endA, this.fromB + startB, this.fromB + endB, Span.slice(this.deleted, startA, endA), Span.slice(this.inserted, startB, endB));
250
+ }
251
+ }], [{
252
+ key: "merge",
253
+ value: function merge(x, y, combine) {
254
+ if (x.length == 0) return y;
255
+ if (y.length == 0) return x;
256
+ var result = [];
257
+
258
+ for (var iX = 0, iY = 0, curX = x[0], curY = y[0];;) {
259
+ if (!curX && !curY) {
260
+ return result;
261
+ } else if (curX && (!curY || curX.toB < curY.fromA)) {
262
+ var off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0;
263
+ result.push(off == 0 ? curX : new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off, curX.deleted, curX.inserted));
264
+ curX = iX++ == x.length ? null : x[iX];
265
+ } else if (curY && (!curX || curY.toA < curX.fromB)) {
266
+ var _off = iX ? x[iX - 1].toB - x[iX - 1].toA : 0;
267
+
268
+ result.push(_off == 0 ? curY : new Change(curY.fromA - _off, curY.toA - _off, curY.fromB, curY.toB, curY.deleted, curY.inserted));
269
+ curY = iY++ == y.length ? null : y[iY];
270
+ } else {
271
+ var pos = Math.min(curX.fromB, curY.fromA);
272
+ var fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)),
273
+ toA = fromA;
274
+ var fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)),
275
+ toB = fromB;
276
+ var deleted = Span.none,
277
+ inserted = Span.none;
278
+ var enteredX = false,
279
+ enteredY = false;
280
+
281
+ for (;;) {
282
+ var nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB;
283
+ var nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA;
284
+ var next = Math.min(nextX, nextY);
285
+ var inX = curX && pos >= curX.fromB,
286
+ inY = curY && pos >= curY.fromA;
287
+ if (!inX && !inY) break;
288
+
289
+ if (inX && pos == curX.fromB && !enteredX) {
290
+ deleted = Span.join(deleted, curX.deleted, combine);
291
+ toA += curX.lenA;
292
+ enteredX = true;
293
+ }
294
+
295
+ if (inX && !inY) {
296
+ inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine);
297
+ toB += next - pos;
298
+ }
299
+
300
+ if (inY && pos == curY.fromA && !enteredY) {
301
+ inserted = Span.join(inserted, curY.inserted, combine);
302
+ toB += curY.lenB;
303
+ enteredY = true;
304
+ }
305
+
306
+ if (inY && !inX) {
307
+ deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine);
308
+ toA += next - pos;
309
+ }
310
+
311
+ if (inX && next == curX.toB) {
312
+ curX = iX++ == x.length ? null : x[iX];
313
+ enteredX = false;
314
+ }
315
+
316
+ if (inY && next == curY.toA) {
317
+ curY = iY++ == y.length ? null : y[iY];
318
+ enteredY = false;
319
+ }
320
+
321
+ pos = next;
322
+ }
323
+
324
+ if (fromA < toA || fromB < toB) result.push(new Change(fromA, toA, fromB, toB, deleted, inserted));
325
+ }
326
+ }
327
+ }
328
+ }]);
329
+
330
+ return Change;
331
+ }();
332
+
333
+ var letter;
334
+
335
+ try {
336
+ letter = new RegExp("[\\p{Alphabetic}_]", "u");
337
+ } catch (_) {}
338
+
339
+ var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;
340
+
341
+ function isLetter(code) {
342
+ if (code < 128) return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122;
343
+ var ch = String.fromCharCode(code);
344
+ if (letter) return letter.test(ch);
345
+ return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch);
346
+ }
347
+
348
+ function getText(frag, start, end) {
349
+ var out = "";
350
+
351
+ function convert(frag, start, end) {
352
+ for (var i = 0, off = 0; i < frag.childCount; i++) {
353
+ var child = frag.child(i),
354
+ endOff = off + child.nodeSize;
355
+ var from = Math.max(off, start),
356
+ to = Math.min(endOff, end);
357
+
358
+ if (from < to) {
359
+ if (child.isText) {
360
+ out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off));
361
+ } else if (child.isLeaf) {
362
+ out += " ";
363
+ } else {
364
+ if (from == off) out += " ";
365
+ convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off));
366
+ if (to == endOff) out += " ";
367
+ }
368
+ }
369
+
370
+ off = endOff;
371
+ }
372
+ }
373
+
374
+ convert(frag, start, end);
375
+ return out;
376
+ }
377
+
378
+ var MAX_SIMPLIFY_DISTANCE = 30;
379
+
380
+ function simplifyChanges(changes, doc) {
381
+ var result = [];
382
+
383
+ for (var i = 0; i < changes.length; i++) {
384
+ var end = changes[i].toB,
385
+ start = i;
386
+
387
+ while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE) {
388
+ end = changes[++i].toB;
389
+ }
390
+
391
+ simplifyAdjacentChanges(changes, start, i + 1, doc, result);
392
+ }
393
+
394
+ return result;
395
+ }
396
+
397
+ function simplifyAdjacentChanges(changes, from, to, doc, target) {
398
+ var start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE);
399
+ var end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE);
400
+ var text = getText(doc.content, start, end);
401
+
402
+ for (var i = from; i < to; i++) {
403
+ var startI = i,
404
+ last = changes[i],
405
+ deleted = last.lenA,
406
+ inserted = last.lenB;
407
+
408
+ while (i < to - 1) {
409
+ var next = changes[i + 1],
410
+ boundary = false;
411
+ var prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start));
412
+
413
+ for (var pos = last.toB; !boundary && pos < next.fromB; pos++) {
414
+ var nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start));
415
+ if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) boundary = true;
416
+ prevLetter = nextLetter;
417
+ }
418
+
419
+ if (boundary) break;
420
+ deleted += next.lenA;
421
+ inserted += next.lenB;
422
+ last = next;
423
+ i++;
424
+ }
425
+
426
+ if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {
427
+ var _from = changes[startI].fromB,
428
+ _to = changes[i].toB;
429
+ if (_from < end && isLetter(text.charCodeAt(_from - start))) while (_from > start && isLetter(text.charCodeAt(_from - 1 - start))) {
430
+ _from--;
431
+ }
432
+ if (_to > start && isLetter(text.charCodeAt(_to - 1 - start))) while (_to < end && isLetter(text.charCodeAt(_to - start))) {
433
+ _to++;
434
+ }
435
+ var joined = fillChange(changes.slice(startI, i + 1), _from, _to);
436
+
437
+ var _last = target.length ? target[target.length - 1] : null;
438
+
439
+ if (_last && _last.toA == joined.fromA) target[target.length - 1] = new Change(_last.fromA, joined.toA, _last.fromB, joined.toB, _last.deleted.concat(joined.deleted), _last.inserted.concat(joined.inserted));else target.push(joined);
440
+ } else {
441
+ for (var j = startI; j <= i; j++) {
442
+ target.push(changes[j]);
443
+ }
444
+ }
445
+ }
446
+
447
+ return changes;
448
+ }
449
+
450
+ function combine(a, b) {
451
+ return a === b ? a : null;
452
+ }
453
+
454
+ function fillChange(changes, fromB, toB) {
455
+ var fromA = changes[0].fromA - (changes[0].fromB - fromB);
456
+ var last = changes[changes.length - 1];
457
+ var toA = last.toA + (toB - last.toB);
458
+ var deleted = Span.none,
459
+ inserted = Span.none;
460
+ var delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data;
461
+ var insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data;
462
+
463
+ for (var posA = fromA, posB = fromB, i = 0;; i++) {
464
+ var next = i == changes.length ? null : changes[i];
465
+ var endA = next ? next.fromA : toA,
466
+ endB = next ? next.fromB : toB;
467
+ if (endA > posA) deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine);
468
+ if (endB > posB) inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine);
469
+ if (!next) break;
470
+ deleted = Span.join(deleted, next.deleted, combine);
471
+ inserted = Span.join(inserted, next.inserted, combine);
472
+ if (deleted.length) delData = deleted[deleted.length - 1].data;
473
+ if (inserted.length) insData = inserted[inserted.length - 1].data;
474
+ posA = next.toA;
475
+ posB = next.toB;
476
+ }
477
+
478
+ return new Change(fromA, toA, fromB, toB, deleted, inserted);
479
+ }
480
+
481
+ var ChangeSet = function () {
482
+ function ChangeSet(config, changes) {
483
+ _classCallCheck(this, ChangeSet);
484
+
485
+ this.config = config;
486
+ this.changes = changes;
487
+ }
488
+
489
+ _createClass(ChangeSet, [{
490
+ key: "addSteps",
491
+ value: function addSteps(newDoc, maps, data) {
492
+ var _this = this;
493
+
494
+ var stepChanges = [];
495
+
496
+ var _loop = function _loop(i) {
497
+ var d = Array.isArray(data) ? data[i] : data;
498
+ var off = 0;
499
+ maps[i].forEach(function (fromA, toA, fromB, toB) {
500
+ stepChanges.push(new Change(fromA + off, toA + off, fromB, toB, fromA == toA ? Span.none : [new Span(toA - fromA, d)], fromB == toB ? Span.none : [new Span(toB - fromB, d)]));
501
+ off = toB - fromB - (toA - fromA);
502
+ });
503
+ };
504
+
505
+ for (var i = 0; i < maps.length; i++) {
506
+ _loop(i);
507
+ }
508
+
509
+ if (stepChanges.length == 0) return this;
510
+ var newChanges = mergeAll(stepChanges, this.config.combine);
511
+ var changes = Change.merge(this.changes, newChanges, this.config.combine);
512
+ var updated = changes;
513
+
514
+ var _loop2 = function _loop2(_i3) {
515
+ var change = updated[_i3];
516
+
517
+ if (change.fromA == change.toA || change.fromB == change.toB || !newChanges.some(function (r) {
518
+ return r.toB > change.fromB && r.fromB < change.toB;
519
+ })) {
520
+ _i2 = _i3;
521
+ return "continue";
522
+ }
523
+
524
+ var diff = computeDiff(_this.config.doc.content, newDoc.content, change);
525
+
526
+ if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB) {
527
+ _i2 = _i3;
528
+ return "continue";
529
+ }
530
+
531
+ if (updated == changes) updated = changes.slice();
532
+
533
+ if (diff.length == 1) {
534
+ updated[_i3] = diff[0];
535
+ } else {
536
+ var _updated;
537
+
538
+ (_updated = updated).splice.apply(_updated, [_i3, 1].concat(_toConsumableArray(diff)));
539
+
540
+ _i3 += diff.length - 1;
541
+ }
542
+
543
+ _i2 = _i3;
544
+ };
545
+
546
+ for (var _i2 = 0; _i2 < updated.length; _i2++) {
547
+ var _ret2 = _loop2(_i2);
548
+
549
+ if (_ret2 === "continue") continue;
550
+ }
551
+
552
+ return new ChangeSet(this.config, updated);
553
+ }
554
+ }, {
555
+ key: "startDoc",
556
+ get: function get() {
557
+ return this.config.doc;
558
+ }
559
+ }, {
560
+ key: "map",
561
+ value: function map(f) {
562
+ var mapSpan = function mapSpan(span) {
563
+ var newData = f(span);
564
+ return newData === span.data ? span : new Span(span.length, newData);
565
+ };
566
+
567
+ return new ChangeSet(this.config, this.changes.map(function (ch) {
568
+ return new Change(ch.fromA, ch.toA, ch.fromB, ch.toB, ch.deleted.map(mapSpan), ch.inserted.map(mapSpan));
569
+ }));
570
+ }
571
+ }, {
572
+ key: "changedRange",
573
+ value: function changedRange(b, maps) {
574
+ if (b == this) return null;
575
+ var touched = maps && touchedRange(maps);
576
+ var moved = touched ? touched.toB - touched.fromB - (touched.toA - touched.fromA) : 0;
577
+
578
+ function map(p) {
579
+ return !touched || p <= touched.fromA ? p : p + moved;
580
+ }
581
+
582
+ var from = touched ? touched.fromB : 2e8,
583
+ to = touched ? touched.toB : -2e8;
584
+
585
+ function add(start) {
586
+ var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : start;
587
+ from = Math.min(start, from);
588
+ to = Math.max(end, to);
589
+ }
590
+
591
+ var rA = this.changes,
592
+ rB = b.changes;
593
+
594
+ for (var iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {
595
+ var rangeA = rA[iA],
596
+ rangeB = rB[iB];
597
+
598
+ if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) {
599
+ iA++;
600
+ iB++;
601
+ } else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) {
602
+ add(rangeB.fromB, rangeB.toB);
603
+ iB++;
604
+ } else {
605
+ add(map(rangeA.fromB), map(rangeA.toB));
606
+ iA++;
607
+ }
608
+ }
609
+
610
+ return from <= to ? {
611
+ from: from,
612
+ to: to
613
+ } : null;
614
+ }
615
+ }], [{
616
+ key: "create",
617
+ value: function create(doc) {
618
+ var combine = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (a, b) {
619
+ return a === b ? a : null;
620
+ };
621
+ return new ChangeSet({
622
+ combine: combine,
623
+ doc: doc
624
+ }, []);
625
+ }
626
+ }]);
627
+
628
+ return ChangeSet;
629
+ }();
630
+
631
+ ChangeSet.computeDiff = computeDiff;
632
+
633
+ function mergeAll(ranges, combine) {
634
+ var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
635
+ var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ranges.length;
636
+ if (end == start + 1) return [ranges[start]];
637
+ var mid = start + end >> 1;
638
+ return Change.merge(mergeAll(ranges, combine, start, mid), mergeAll(ranges, combine, mid, end), combine);
639
+ }
640
+
641
+ function endRange(maps) {
642
+ var from = 2e8,
643
+ to = -2e8;
644
+
645
+ for (var i = 0; i < maps.length; i++) {
646
+ var map = maps[i];
647
+
648
+ if (from != 2e8) {
649
+ from = map.map(from, -1);
650
+ to = map.map(to, 1);
651
+ }
652
+
653
+ map.forEach(function (_s, _e, start, end) {
654
+ from = Math.min(from, start);
655
+ to = Math.max(to, end);
656
+ });
657
+ }
658
+
659
+ return from == 2e8 ? null : {
660
+ from: from,
661
+ to: to
662
+ };
663
+ }
664
+
665
+ function touchedRange(maps) {
666
+ var b = endRange(maps);
667
+ if (!b) return null;
668
+ var a = endRange(maps.map(function (m) {
669
+ return m.invert();
670
+ }).reverse());
671
+ return {
672
+ fromA: a.from,
673
+ toA: a.to,
674
+ fromB: b.from,
675
+ toB: b.to
676
+ };
677
+ }
678
+
679
+ function sameRanges(a, b, map) {
680
+ return map(a.fromB) == b.fromB && map(a.toB) == b.toB && sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted);
681
+ }
682
+
683
+ function sameSpans(a, b) {
684
+ if (a.length != b.length) return false;
685
+
686
+ for (var i = 0; i < a.length; i++) {
687
+ if (a[i].length != b[i].length || a[i].data !== b[i].data) return false;
688
+ }
689
+
690
+ return true;
691
+ }
692
+
693
+ exports.Change = Change;
694
+ exports.ChangeSet = ChangeSet;
695
+ exports.Span = Span;
696
+ exports.simplifyChanges = simplifyChanges;