> On May 19, 2016, at 6:52 PM, Kevin Ballard via swift-evolution 
> <[email protected]> wrote:
> 
> After having given this some thought, it seems apparent that 
> `sequence(state:next:)` is equivalent to `AnyIterator({ ... })` where the 
> closure captures a single mutable variable. The microbenchmark performance 
> may differ slightly, as the AnyIterator version will allocate a box on the 
> heap to hold the captured variable (assuming it can't get inlined entirely), 
> whereas UnfoldSequence won't. But the functionality is the same.
>  
> Thus the question: do we want to keep `sequence(state:next:)` or is it too 
> close to AnyIterator in functionality? Arguments in favor of 
> `sequence(state:next:)`:
>  
> * It's equivalent to unfold and the dual of reduce, so people who've used 
> functional programming languages may expect it to exist.
> * It allows you to create ad-hoc stateful sequences without polluting the 
> current scope with a variable that exists solely to be captured.
> * If the cost of a small heap allocation is significant for your code, it may 
> be more performant than AnyIterator.
>  
> Personally, the most important reason here for me is not having to pollute 
> the current closure with a variable. And this could actually be solved 
> another way, by allowing the use of `var` in a capture list, which would let 
> you say something like `AnyGenerator({ [var state=foo] in ... })`.
>  
> Given all this, at this point I'm actually leaning towards 
> saying`sequence(state:next:)` doesn't pull its own weight and we should just 
> go with `sequence(initial:next:)`.
>  
> -Kevin Ballard

Adding on, to the best of my understanding the biggest win in the stateful 
variation is to be able to create a sequence from a starting state without 
declaring any external variables, as in the perfectly wrong and evil example I 
showed Kevin:

enum Finger: Int { case Thumb = 1, Pointer, Middle, Ring, Pinky }

extension Finger {
    static func members() -> AnySequence<Finger> {
        return sequence(Thumb.rawValue, next: {
            (inout idx: Int) in
            defer { idx += 1 }
            return Finger(rawValue: idx)
        })
    }
}

for finger in Finger.members() { print(finger) }

-- E

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

Reply via email to