> On Dec 31, 2015, at 1:02 PM, Dave Abrahams via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
>> 
>> On Dec 31, 2015, at 10:52 AM, Donnacha Oisín Kidney <oisin.kid...@gmail.com 
>> <mailto:oisin.kid...@gmail.com>> wrote:
>> 
>> Just to add to that, it’s always seemed strange to me that to signify your 
>> sequence is multi-pass (i.e., to make it conform to CollectionType) you have 
>> to have it conform to Indexable. 
> 
> FWIW, Indexable is an implementation artifact that will go away when Swift’s 
> generics system is improved.
> 
> But if your real objection is that you have to come up with an Index and a 
> subscripting operator, I can understand that.  Part of the reason for this is 
> our reluctance to create any distinct protocols with identical syntactic 
> requirements 
> <http://news.gmane.org/find-root.php?message_id=2a3e0c76-1c88-4752-8a70-aa64bb142...@apple.com>.
>   To justify having a separate multi-pass sequence protocol, there would have 
> to be a significant/important class of multi-pass sequences for which 
> CollectionType was unimplementable without serious costs.
> 
> In principle there’s a way to ease the pain of creating CollectionType 
> conformances for multipass SequenceTypes…if only it didn’t crash the compiler 
> <https://bugs.swift.org/browse/SR-427> ;-).  Here’s a variation that uses a 
> generic adapter instead of a protocol conformance declaration:

I probably failed to make clear that the code below works today, and doesn’t 
crash the compiler:

> 
> /// A `CollectionType` containing the same elements as `Base`, without 
> storing them.
> ///
> /// - Requires: `Base` supports multiple passes (traversing it does not
> ///   consume the sequence), and `Base.Generator` has value semantics
> public struct Multipass<Base: SequenceType where Base.Generator: Equatable> : 
> CollectionType {
>   public var startIndex: MultipassIndex<Base> {
>     var g = _base.generate()
>     return MultipassIndex(buffer: g.next(), generator: g)
>   }
>   
>   public var endIndex: MultipassIndex<Base> {
>     return MultipassIndex(buffer: nil, generator: _base.generate())
>   }
> 
>   public subscript(position: MultipassIndex<Base>) -> Base.Generator.Element {
>     return position.buffer!
>   }
> 
>   public init(_ base: Base) {
>     _base = base
>   }
>   
>   var _base: Base
> }
> 
> // Note: Requires T.Generator has value semantics
> public struct MultipassIndex<T: SequenceType where T.Generator: Equatable> : 
> ForwardIndexType {
>   public func successor() -> MultipassIndex {
>     var r = self
>     r.buffer = r.generator.next()
>     return r
>   }
>   var buffer: T.Generator.Element?
>   var generator: T.Generator
> }
> 
> public func == <T>(x: MultipassIndex<T>, y: MultipassIndex<T>) -> Bool {
>   return x.buffer == nil && y.buffer == nil || x.generator == y.generator
> }
> 
> //===--- An example fibonacci sequence 
> ------------------------------------===//
> struct FibGenerator : GeneratorType {
>   mutating func next() -> Int? {
>     let c = a + b
>     a = b
>     b = c
>     return a < limit ? a : nil
>   }
>   var a, b, limit: Int
> }
> 
> 
> struct Fib : SequenceType {
>   var limit = 1000
>   
>   func generate() -> FibGenerator {
>     return Generator(a: 0, b: 1, limit: limit)
>   }
> }
> 
> //===--- Adapt Fib for use with Multipass 
> ---------------------------------===//
> extension FibGenerator : Equatable {}
> func == (x: Fib.Generator, y: Fib.Generator) -> Bool {
>   return x.a == y.a
> }
> 
> //===--- Demonstration 
> ----------------------------------------------------===//
> let c = Multipass(Fib())
> print(c.first)
> print(c.count)
> print(c.lazy.map { $0 + 1 })
> 
> 
>> 
>>> On 31 Dec 2015, at 17:52, Erica Sadun via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> I'm trying to work them out, so it's still muddled.
>>> 
>>> Right now, I think SequenceType is better described as CollectionWalkType 
>>> but that's kind of (1) a mouthful and (2) not entirely accurate. 
>>> 
>>> Moving back a step: SequenceType is defined as: "A type that can be 
>>> iterated with a `for`...`in` loop." But it says nothing about whether that 
>>> loop ever terminates and many stdlib sequence functions currently don't 
>>> make sense (at least if they're not lazy) with respect to infinite 
>>> sequences, which should probably be "StreamType" not sequences. A couple of 
>>> examples:
>>> Here's my fib: http://swiftstub.com/189513594/ 
>>> <http://swiftstub.com/189513594/>
>>> And here's Oisin's user-input sequence:  
>>> https://gist.github.com/oisdk/2c7ac33bf2188528842a 
>>> <https://gist.github.com/oisdk/2c7ac33bf2188528842a>
>>> Both of these are theoretically filterable, but they aren't dropLast-able, 
>>> suffix-able, properly split-able, etc.
>>> 
>>> Hopefully that's enough of a starting point to indicate where my thinking 
>>> is at and what I'm trying to think through when it comes to this. -- E
>>> 
>>> 
>>>> On Dec 31, 2015, at 10:09 AM, Dave Abrahams <dabrah...@apple.com 
>>>> <mailto:dabrah...@apple.com>> wrote:
>>>> 
>>>> 
>>>>> On Dec 31, 2015, at 9:05 AM, Erica Sadun via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>> It does seem that in Swift the concepts of collection, sequence, 
>>>>> permutation, stream, etc are a bit muddled.
>>>> 
>>>> This is a pretty vague critique.  Do you have specifics, and suggestions 
>>>> that address them?
>>>> 
>>>>> 
>>>>> -- E
>>>>> 
>>>>> 
>>>>>> On Dec 31, 2015, at 6:51 AM, Tino Heth via swift-evolution 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>>> 
>>>>>>> Those are collections.  Collections can be iterated over multiple times.
>>>>>> Speaking of the Fibonacci-numbers:
>>>>>> Sure we can write an algorithm that iterates over them several times — 
>>>>>> it just won't ever finish the first iteration ;-)
>>>>>> (only nitpicking — I just couldn't resist)
>>>>>> 
>>>>>> Happy new year!
>>>>>> _______________________________________________
>>>>>> swift-evolution mailing list
>>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>>> -Dave
>>>> 
>>> 
>>>  _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> -Dave
> 
>  _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
-Dave

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to