64
ternatively, the data could be allowed to remain in place, even though its context is deleted.
This seems superficially attractive in the case of a single merge operation, since it does not
allow the inserted data to silently vanish, but it is a bad idea in an operationally complete
system. If this semantics were adopted, an application trying to delete a range containing
data from several insertion points would have to specify each portion of the desired range
that intersected with any of the insertion changes in its desired range.
In the case of a range whose data is being replicated elsewhere, there are also two
choices: Either the insertion should be visible in the copied subsequence at its destination,
or it should not. Exactly the same problem that we have just seen occurs in different form if
the insertion is not visible at the destination. An application desiring to specify an entire
subsequence would be required to determine, and explicitly include, every insertion point in
the affected range. This also reduces the flexibility of a merge operation, since edits made to
a source range would fail to propagate if they were not explicitly mentioned in that range.
These two cases highlight a general principle in conflict resolution. One of the great ad-
vantages of the sequence structure is that operations that are applied to ranges should, in
general apply to everythingwithin that range. The power of the range concept is essentially
that it allows the use of two ordered points to refer to a large number of elements (the sub-
sequence), and its individual history as expressed by the operations that create it.Because the
system is change-complete, the operations in that history may be different in different
states of the sequence (depending on what changes are currently active), and operations
should have the maximum effect possible without compromising the ability to use ranges as
a way to specify extents of effect.
In the case of delete, the most flexible option (and the only one that preserves the basic
concept of the range) is to have deletion take priority over any operation that adds data in
the middle of the deleted range, while in the case of the copying of data, the greatest flexi-
ternatively, the data could be allowed to remain in place, even though its context is deleted.
This seems superficially attractive in the case of a single merge operation, since it does not
allow the inserted data to silently vanish, but it is a bad idea in an operationally complete
system. If this semantics were adopted, an application trying to delete a range containing
data from several insertion points would have to specify each portion of the desired range
that intersected with any of the insertion changes in its desired range.
In the case of a range whose data is being replicated elsewhere, there are also two
choices: Either the insertion should be visible in the copied subsequence at its destination,
or it should not. Exactly the same problem that we have just seen occurs in different form if
the insertion is not visible at the destination. An application desiring to specify an entire
subsequence would be required to determine, and explicitly include, every insertion point in
the affected range. This also reduces the flexibility of a merge operation, since edits made to
a source range would fail to propagate if they were not explicitly mentioned in that range.
These two cases highlight a general principle in conflict resolution. One of the great ad-
vantages of the sequence structure is that operations that are applied to ranges should, in
general apply to everythingwithin that range. The power of the range concept is essentially
that it allows the use of two ordered points to refer to a large number of elements (the sub-
sequence), and its individual history as expressed by the operations that create it.Because the
system is change-complete, the operations in that history may be different in different
states of the sequence (depending on what changes are currently active), and operations
should have the maximum effect possible without compromising the ability to use ranges as
a way to specify extents of effect.
In the case of delete, the most flexible option (and the only one that preserves the basic
concept of the range) is to have deletion take priority over any operation that adds data in
the middle of the deleted range, while in the case of the copying of data, the greatest flexi-