[swift-evolution] [Pitch] Remove destructive consumption from Sequence

Dave Abrahams dabrahams at apple.com
Fri Jul 1 11:54:55 CDT 2016


on Fri Jul 01 2016, Matthew Johnson <matthew-AT-anandabits.com> wrote:

>> On Jul 1, 2016, at 9:47 AM, Dave Abrahams <dabrahams at apple.com> wrote:
>> 
>> 
>> on Fri Jul 01 2016, Haravikk <swift-evolution-AT-haravikk.me> wrote:
>> 
>
>>>> On 30 Jun 2016, at 23:39, Dave Abrahams <dabrahams at apple.com> wrote:
>>>> All multi-pass sequences can benefit from subscripts.
>>> 
>>> Sorry, not really what I meant, but rather; how many sequences are
>>> really going to use them?
>> 
>> The subscript and index aren't there for the sequence's benefit, and you
>> can't know how users will want to use the sequence.  The whole point of
>> making a type conform to a generic protocol is that you can't anticipate
>> all of the type's uses, so you want to make it work with as much other
>> code as possible.  If I'm defining a new sequence type, how can I know
>> whether someone might want to use index(of:) or slicing on it?
>
> This isn’t entirely true.  Sometimes we know *exactly* how a type will
> be used in an application.  It conforms to a generic protocol in order
> to take advantage of pre-existing generic code (algorithms, etc) in
> the standard library (or other libraries).
>
> If the library contains algorithms expressed in terms of the weakest
> constraints possible (i.e. the current `Sequence` algorithms)
> sometimes we can accomplish what is necessary without needing to
> implement additional members on our type, even if it is possible to
> implement them and theoretically useful (but not useful to the current
> requirements of the application).

Yes, but requirements clustering is absolutely essential to creating
coherent generic libraries.  Otherwise you end up with a billion little
granular protocols, to no real purpose.

> That said, I generally like the direction you suggesting.  
>
> I have been considering the incremental complexity of conforming to
> `Collection` rather than `Sequence` carefully.  The one place that I
> still need to think further about is the `Comparable` requirement on
> indices and whether that might lead to nontrivial complexity over a
> `Sequence` conformance.

It might, but let's drop it.  The only *real* reason we have it is to
provide nice precondition checking for Range construction, and we can
simply make that conditional on comparability.

-- 
Dave


More information about the swift-evolution mailing list