> On Jan 6, 2016, at 11:37 AM, Jordan Rose via swift-evolution 
> <[email protected]> wrote:
> 
> I've bounced this idea off of Dave and Dmitri internally, so might as well 
> put it out publicly:
> 
> In Magic DWIM Swift, there would only be two types that you'd ever conform 
> to: a destructive iteration type (today's "Generator"), and a multi-pass 
> indexed type (today's "Collection"). Some operations can meaningfully use 
> either one (like forEach or maxElement); these operations go on a general 
> "traversable" type (today's "Sequence").
> 
> In this world, both GeneratorType and CollectionType are refinements of 
> SequenceType (i.e. any GeneratorType "is-a" SequenceType), including the 
> necessary default implementations. Maybe we rename some of the protocols in 
> the process. Again, no concrete type would ever conform to SequenceType; it's 
> just something you can use as a generic constraint.
> 
> We can't actually do this today because it creates a circularity between 
> SequenceType and GeneratorType that the compiler can't handle. I'm pretty 
> sure it's possible to change the compiler's protocol checking logic to allow 
> this, though.
> 
> Anyway, that's that idea. At the very least it helped me clear up my thoughts 
> about Sequence, Collection, and Generator back when I was first learning them.
> 
> Jordan
> 
> P.S. This idea falls apart if someone comes up with a model (concrete type) 
> for SequenceType that isn't a Collection or Generator. I wasn't able to think 
> of one back when I was originally thinking about this, but of course that 
> doesn't mean there isn't one. (Infinite collections are interesting as 
> discussed on the "cycle" thread, but it's not the sequence/generator 
> distinction that's really meaningful there.)

It’s not clear what you mean by a `SequenceType` that isn’t either a 
`Collection` or a `Generator`, but if you mean a *concrete* sequence that:

- can be re-iterated (thus not a `Generator`)
- has no meaningful index (!) (thus not a `Collection`)

…then I can provide you with examples of such. The (!) is b/c you can of course 
always use `Int` as an index, in the sense that “the value at index `n` is 
obtained by iterating `n` steps from the start of the sequence”; I’ll assume 
this doesn’t “count” as an index for purposes of this discussion.

Given the above, I will provide two examples.

Here is one that is stable, re-iterable, infinite, and has no “non-trivial" 
index:

    // Modest generalization of a seedable PRNG.
    // We assume that identically-seeded sources generate
    // identical elements (via `randomElement`), in identical order.
    protocol RandomElementSourceType {

      typealias Element
      typealias Seed: Equatable
      // ^ `:Equatable` isn't actually necessary, but it's nice
  
      init(seed: Seed)
  
      mutating func randomElement() -> Element

    }

    struct RandomElementGenerator<R:RandomElementSourceType> : GeneratorType {

      typealias Element = R.Element
  
      private var source: R
  
      mutating func next() -> Element? {
        return source.randomElement() // <- never stops!
      }
  
    }

    struct RandomElementSequence<R:RandomElementSourceType> : SequenceType {

      typealias Generator = RandomElementGenerator<R>
  
      private let seed: R.Seed
  
      func generate() -> Generator {
        return Generator(source: R(seed: seed))
        // ^ as per assumptions, each iteration will be identical b/c
        //   because each iteration uses the same seed 
      }

    }

…and here is one that is not-necessarily-stable, reiteration-capable, finite 
(one hopes!), and with no “non-trivial” index:

    struct SuperviewGenerator : GeneratorType {
    
      typealias Element = UIView
    
      private var currentView: UIView? // or NSView on OS X, etc.
      
      private init(initialView: UIView?) {
        currentView = initialView
      }
      
      mutating func next() -> Element? {
        guard let here = currentView else {
          return nil
        }
        currentView = here.superview
        return here
      }
    
    }

    // also e.g. analogous constructs for `CALayer`,
    // `UIViewController`, `UIResponder`, “folders/directories”, and so on...
    struct SuperviewSequence : SequenceType {

      typealias Generator = SuperviewGenerator
      
      private let initialView: UIView?
      
      init(initialView: UIView?) {
        self.initialView = initialView
      }
      
      func generate() -> Generator {
        return Generator(initialView: initialView)
      }
      
      func underestimateCount() -> Int {
        return initialView != nil ? 1 : 0
      }
      
    }
    
    // Useful extensions:
    extension UIView {
    
      // Enumerates the view hierarchy upward from `self`, including `self`.
      func inclusiveSuperviewSequence() -> SuperviewSequence {
        return SuperviewSequence(initialView: self)
      }
      
      // Enumerates the view hierarchy upward from `self`, omitting `self`.
      func exclusiveSuperviewSequence() -> SuperviewSequence { 
        return SuperviewSequence(initialView: self.superview)
      }
    
    }



> 
> 
>> On Dec 31, 2015, at 9:52, Erica Sadun via swift-evolution 
>> <[email protected] <mailto:[email protected]>> 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 <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> 
>>>> On Dec 31, 2015, at 9:05 AM, Erica Sadun via swift-evolution 
>>>> <[email protected] <mailto:[email protected]>> 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 
>>>>> <[email protected] <mailto:[email protected]>> 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
>>>>> [email protected] <mailto:[email protected]>
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> [email protected] <mailto:[email protected]>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> -Dave
>>> 
>> 
>> <open.gif> _______________________________________________
>> swift-evolution mailing list
>> [email protected] <mailto:[email protected]>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>  _______________________________________________
> swift-evolution mailing list
> [email protected] <mailto:[email protected]>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to