+1

Sent from my iPad

> On 1 Jan 2016, at 11:16 AM, Kevin Ballard via swift-evolution 
> <[email protected]> wrote:
> 
> BufferedSequence is a sequence adaptor that wraps any underlying sequence and 
> provides a stable `first` property. BufferedGenerator is a generator adaptor 
> that wraps any underlying generator and provides arbitrary lookahead with a 
> `peek(n: Int)` method.
>  
> The method name "peek()" has precedent in various languages (e.g. Rust with 
> std::iter::Peekable, C++ with std::basic_istream::peek, Ruby with 
> Enumerator#peek, etc). I considered the name "lookahead()" but I decided it 
> made more sense to use that name for the property that describes how much 
> lookahead there is.
>  
> The proposed API looks like this:
>  
> /// A sequence adaptor that adds a nondestructive `first` property to any
> /// underlying sequence.
> /// - Note: If the underlying sequence is not destructively "consumed" by
> ///   iteration, then neither is `BufferedSequence`.
> public class BufferedSequence<Base : SequenceType> : SequenceType {
>     public init(_ base: Base)
> 
>     /// Returns ` BufferedGenerator` with a lookahead size of `1`.
>     public func generate() -> 
> BufferedSequence.BufferedGenerator<Base.Generator>
> 
>     /// Returns the first element of the underlying sequence, 
> **nondestructively**.
>     public var first: Base.Generator.Element? { get }
> }
> 
> /// A generator adaptor that adds a nondestructive `peek()` method to any
> /// underlying generator.
> public struct BufferedGenerator<Base : GeneratorType> : GeneratorType {
>     /// Construct an instance that buffers access to an underlying generator.
>     /// - Parameter base: The underlying generator.
>     /// - Parameter lookahead: The amount of lookahead to allow. Default is 
> `1`.
>     ///   Values less than `1` will be treated the same as `1`.
>     public init(_ base: Base, lookahead: Int = default)
> 
>     /// The amount of lookahead that this generator offers.
>     /// - Invariant: `lookahead >= 1`.
>     public let lookahead: Int
> 
>     /// Advance to the next element and return it, or `nil` if no next 
> element exists.
>     ///
>     /// - Requires: Neither `next()` nor `peek()` have been applied to a copy 
> of
>     ///   `self` since the copy was made, and no preceding call to 
> `self.next()` has
>     ///   returned `nil`.
>     public mutating func next() -> Base.Element?
> 
>     /// Returns the value that will be returned from subsequent calls to 
> `next()`.
>     /// - Parameter n: The number of elements to look ahead. Default is `0`. 
> A value
>     ///   of `0` means to look at the next element.
>     /// - Precondition: `n >= 0 && n < lookahead`.
>     /// - Requires: Neither `next()` nor `peek()` have been applied to a copy 
> of
>     ///   `self` since the copy was made, and no preceding call to 
> `self.next()` has
>     ///   returned `nil`.
>     /// - Note: It is safe to peek at values past the end of the underlying 
> generator
>     ///  (`peek()` will return `nil` in such cases). It is also safe to call 
> `peek()`
>     ///  repeatedly, even after it's returned `nil`, and similarly it is safe 
> to call
>     ///  `next()` after `peek()` has returned `nil`.
>     public mutating func peek(n: Int = default) -> Base.Element?
> }
> 
> BufferedSequence is a class because the generate() function needs to mutate 
> it. After the `first` property has been accessed, it needs to cache the 
> generator it used for that so it can return it from the next call to 
> generate(), but it also needs to nil out that cache at that time so it 
> doesn't try and return the same generator instance a second time on a 
> subsequent call to generate() (this way BufferedSequence can be written to 
> support non-destructive iteration if the underlying sequence is 
> non-destructive).
>  
> I've already started sketching out an implementation as well. I believe it 
> should be possible to optimize BufferedGenerator for a lookahead of 1 to 
> avoid the heap allocation of an array.
>  
> -Kevin Ballard
>  
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> 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