> On Dec 31, 2015, at 3:20 PM, Kevin Ballard <ke...@sb.org> wrote:
> 
> On Thu, Dec 31, 2015, at 02:03 PM, Dave Abrahams wrote:
>>  
>>> On Dec 31, 2015, at 1:58 PM, Kevin Ballard <ke...@sb.org 
>>> <mailto:ke...@sb.org>> wrote:
>>>  
>>> Good idea, though I'd probably call it PeekSequence because it would only 
>>> buffer a single element (and BufferedSequence sounds like it's got an 
>>> arbitrary-sized buffer). Perhaps more useful would be the associated 
>>> PeekGenerator, because peek() is a useful thing to have when writing custom 
>>> generator-using code.
>>  
>> The size of the buffer is an implementation detail, and I don’t find “peek” 
>> descriptive.
>  
> There's precedent for the name "peek". More importantly, that's the name 
> you'd use for the generator method; the sequence would still have the "first" 
> property.
>  
> My concern with making the size of the buffer be an implementation detail is 
> I'd rather not add array allocation if I only need a single element of 
> lookahead. I suppose it could have an `enum { OneElement(Element), 
> Buffer([Element]) }` as the storage, but that still does end up being a 
> little bit of extra work on every call to next().
>  
>>> I'll write up a more detailed email with a proposed design in a minute.
>>>  
>>>> Another related adapter I’d like to add is a model of CollectionType that 
>>>> is backed by a sequence and lazily populated in fixed-sized chunks.
>>>  
>>> Also a good idea. Although really it could just be backed by a 
>>> ContiguousArray, those things already grow in chunks. I'll write up a 
>>> design for that too.
>>  
>> Not unless you want to keep the buffers alive longer than necessary.  
>> Imagine you’re parsing a long stream with some amount of lookahead.  You can 
>> scan this collection by slicing it and the buffer segments that are no 
>> longer in use will be automatically collected.
>  
> Ah, I didn't realize you wanted to collect chunks that haven't been used 
> lately. But I don't think that's possible;

> since it's backed by a sequence, the chunks MUST be generated in order; 
> there's no way to skip ahead, and no way to generate an older chunk that 
> you've thrown away.

Right…?

> But since it's a CollectionType, you need to preserve the ability to access 
> older values.

Not once you replace it with a slice of itself.

> So the only way to actually have this be a CollectionType is to buffer the 
> entire sequence up to the highest-accessed index.
>  
> Of course, your use-case of processing a stream with some amount of lookahead 
> and throwing away the old data actually sounds like something a 
> "BufferedSequence" might provide. Or actually, a "BufferedGenerator", because 
> the only way to process a sequence is with a generator and so all a 
> "BufferedSequence" would really do is just give you a "BufferedGenerator" 
> from its generate() method.

I’m quite certain this is buildable.  I’ve got my hands full at the moment or 
I’d create a prototype…

-Dave

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

Reply via email to