Definitely well motivated. It seems like having both .enumerated() and .indexed() methods would still leave open the possibility of novices using .enumerated and making the same mistake as before. I realize that because of where .enumerated() sits it has to work the way it does, but is there perhaps a better design (with constrained extensions?) for a single method that can give an Int for a Sequence and an appropriate Index for a Collection?
-Colin > On Sep 28, 2016, at 1:55 PM, Erica Sadun via swift-evolution > <swift-evolution@swift.org> wrote: > > Gist here: https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2 > <https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2> > > Introducing indexed() collections > > Proposal: TBD > Author: Erica Sadun <https://github.com/erica>, Nate Cook > <https://github.com/natecook1000>, Jacob Bandes-Storch > <https://github.com/jtbandes>, Kevin Ballard <https://github.com/kballard> > Status: TBD > Review manager: TBD > > <https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2#introduction>Introduction > > This proposal introduces indexed() to the standard library, a method on > collections that returns an (index, element) tuple sequence. > > Swift-evolution thread: TBD <https://gist.github.com/erica/tbd> > > <https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2#motivation>Motivation > > The standard library's enumerated() method returns a sequence of pairs > enumerating a sequence. The pair's first member is a monotonically > incrementing integer starting at zero, and the second member is the > corresponding element of the sequence. When working with arrays, the integer > is coincidentally the same type and value as an Array index but the > enumerated value is not generated with index-specific semantics. This may > lead to confusion when developers attempt to subscript a non-array collection > with enumerated integers. It can introduce serious bugs when developers use > enumerated()-based integer subscripting with non-zero-based array slices. > > Indices have a specific, fixed meaning in Swift, which are used to create > valid collection subscripts. This proposal introduces indexed() to produce a > more semantically relevant sequence by pairing a collection's indices with > its members. While it is trivial to create a solution in Swift, the most > common developer approach shown here calculates indexes twice: > > extension Collection { > /// Returns a sequence of pairs (*idx*, *x*), where *idx* represents a > /// consecutive collection index, and *x* represents an element of > /// the sequence. > func indexed() -> Zip2Sequence<Self.Indices, Self> { > return zip(indices, self) > } > } > Incrementing an index in some collections can be unnecessarily costly. In a > lazy filtered collection, an index increment is potentially O(N). We feel > this is better addressed introducing a new function into the Standard Library > to provide a more efficient design that avoids the attractive nuisance of the > "obvious" solution. > > > <https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2#detailed-design>Detailed > Design > > Our vision of indexed() bypasses duplicated index generation with their > potentially high computation costs. We'd create an iterator that calculates > each index once and then applies that index to subscript the collection. > Implementation would take place through IndexedSequence, similar to > EnumeratedSequence. > > > <https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2#impact-on-existing-code>Impact > on Existing Code > > This proposal is purely additive and has no impact on existing code. > > > <https://gist.github.com/erica/2b2d92e6db787d001c689d3e37a7c3f2#alternatives-considered>Alternatives > Considered > > Not yet > _______________________________________________ > swift-evolution mailing list > swift-evolution@swift.org > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution