> On Feb 10, 2017, at 5:49 PM, Jonathan Hull via swift-evolution 
> <[email protected]> wrote:
> 
> An easier to implement, but slightly less useful approach, would be to have 
> methods which take an array of indexes along with the proposed change, and 
> then it adjusts the indexes (or replaces them with nil if they are invalid) 
> as it makes the update.  For example:
> 
>       func append(_ element:Element, adjusting: [Index]) -> [Index?]
>       func appending(_ element:Element, adjusting: [Index]) -> (Self, 
> [Index?])

This is a very interesting idea. A couple observations:

1. The problem of adjusting indices is not just a String one. It also applies 
to Array, among other things.

2. This logic could be encapsulated and reused in a separate type. For 
instance, imagine:

        let myStringProxy = IndexTracking(collection: myString, trackedIndices: 
[someIndex, otherIndex])
        myStringProxy.insert("foo", at: otherIndex)
        (someIndex, otherIndex) = (stringProxy.trackedIndices[0], 
stringProxy.trackedIndices[1])

Or, with a helper method:

        myString.withTracked(&someIndex) { myStringProxy in
                myStringProxy.insert("foo", at: otherIndex)
        }

3. An obstacle to doing this correctly is that a collection's index 
invalidation behavior is not expressed in the type system. If there were a 
protocol like:

        protocol RangeReplaceableWithEarlierIndexesStableCollection: 
RangeReplaceableCollection {}

That would help us here.

-- 
Brent Royal-Gordon
Architechies

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to