[swift-evolution] Proposal: Add SequenceType.first
Andrew Bennett
cacoyi at gmail.com
Thu Dec 31 17:36:03 CST 2015
Related to this I've been toying around with a tweak to GeneratorType - it
could clear up some of the issues with .first consuming part of the
sequence:
public protocol NewGeneratorType {
typealias Element
func next() -> (value: Element, state: Self)?
}
extension NewGeneratorType {
mutating func next() -> Element? {
let nextPair: (value: Element, state: Self)? = self.next()
if let state = nextPair?.state {
self = state
}
return nextPair?.value
}
}
I haven't had time for a proposal yet, but thought I'd mention it as it
seemed relevant.
On Thu, Dec 31, 2015 at 7:40 PM, Dave Abrahams via swift-evolution <
swift-evolution at swift.org> wrote:
>
> -Dave
>
> On Dec 30, 2015, at 5:00 PM, Kevin Ballard via swift-evolution <
> swift-evolution at swift.org> wrote:
>
> On Wed, Dec 30, 2015, at 04:39 PM, Daniel Duan wrote:
>
> Here it is
> https://github.com/apple/swift/blob/master/stdlib/public/core/CollectionAlgorithms.swift.gyb#L26
>
>
> On Dec 30, 2015, at 4:27 PM, Kevin Ballard <kevin at sb.org> wrote:
>
> We already don't have a .last on CollectionType and nobody's been
> complaining about that. Besides, sequences don't necessarily even terminate.
>
> -Kevin Ballard
>
> On Wed, Dec 30, 2015, at 04:01 PM, Daniel Duan wrote:
>
> Users who don’t get the single-pass nature of SequenceType may expect a
> .last as well.
>
>
> Ah you're right, I was just looking at the unconstrained protocol. In any
> case, we could theoretically provide a .last, but I don't think that's
> useful enough on sequences to warrant inclusion. I know I've wanted .first
> many times and I've never wanted .last.
>
> Another motivation for adding this that I forgot to mention is that today
> the code `someCol.lazy.filter(pred).first` actually isn't lazy at all, it
> filters the entire collection and builds a new array (because SequenceType
> doesn't have .first so it resolves the .filter() to the eager version
> instead of the lazy version).
>
>
> Oh, that’s nasty. I wonder if there’s something we can do with ambiguity
> to make the eager overload inaccessible in that context? Would you mind
> opening a bug for this?
>
> Adding .first to SequenceType makes that expression actually do what the
> user intended (although my other proposal for SequenceType.find() provides
> a much better way to accomplish the same task).
>
> On Wed, Dec 30, 2015, at 04:40 PM, gs. wrote:
>
> I like this addition and I think that we should take care to document
> whether or not this mutates the sequence. I actually expect it to but maybe
> I am mistaken.
>
>
> (moving this back to the list)
>
> I considered documenting that, but none of the existing "destructive"
> methods on SequenceType document that. I think the assumption is that
> anything that has to inspect the contents of the sequence is obviously
> consuming the sequence to do that. In fact, the one method that doesn't
> consume anything (not counting generate() since any use of the generator is
> destructive), underestimateCount(), is explicitly documented as being
> non-destructive.
>
> Also, I couldn't think of a non-awkward way to say "this property
> partially consumes the sequence if it's a sequence that is destructively
> "consumed" by iteration". Especially because "partially consumed" isn't
> actually a property of sequences; it's explicitly documented that calling
> generate() a second time after any iteration is allowed to return a
> completely arbitrary sequence of elements from the second generator (for
> example, a generator that returns lines read from some stream might buffer
> more data internally and therefore constructing a second generator would
> possibly skip data that was never returned from the first generator).
>
> -Kevin Ballard
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160101/67199a1e/attachment.html>
More information about the swift-evolution
mailing list