invert method
Inverts this delta against base.
Returns new delta which negates effect of this delta when applied to
base. This is an equivalent of "undo" operation on deltas.
Implementation
Delta invert(Delta base) {
final inverted = Delta();
if (base.isEmpty) return inverted;
var baseIndex = 0;
for (final op in _operations) {
if (op.isInsert) {
inverted.delete(op.length);
} else if (op.isRetain && op.isPlain) {
inverted.retain(op.length, null);
baseIndex += op.length;
} else if (op.isDelete || (op.isRetain && op.isNotPlain)) {
final length = op.length;
final sliceDelta = base.slice(baseIndex, baseIndex + length);
sliceDelta.toList().forEach((baseOp) {
if (op.isDelete) {
inverted.push(baseOp);
} else if (op.isRetain && op.isNotPlain) {
var invertAttr = invertAttributes(op.attributes, baseOp.attributes);
inverted.retain(
baseOp.length, invertAttr.isEmpty ? null : invertAttr);
}
});
baseIndex += length;
} else {
throw StateError('Unreachable');
}
}
inverted.trim();
return inverted;
}