> On Apr 4, 2017, at 7:37 PM, Ben Rimmington via swift-evolution 
> <[email protected]> wrote:
> 
>> On 4 Apr 2017, at 22:43, Itai Ferber wrote:
>> 
>>> On 4 Apr 2017, at 1:57, Brent Royal-Gordon wrote:
>>> 
>>> I like the separation between keyed and unkeyed containers (and I think 
>>> "unkeyed" is a good name, though not perfect), but I'm not quite happy with 
>>> the unkeyed container API. Encoding a value into an unkeyed container 
>>> appends it to the container's end; decoding a value from an unkeyed 
>>> container removes it from the container's front. These are very important 
>>> semantics that the method names in question do not imply at all.
>> 
>> I think that consistency of phrasing is really important here, and the 
>> action words "encode" and "decode" are even more important to connote than 
>> the semantics of pushing and popping.
>> (Note that there need not be specific directionality to an unkeyed container 
>> as long as the ordering of encoded items is eventually maintained on 
>> decode.) But on a practical note, names like encodeAtEnd and decodeFromFront 
>> (or similar) don't feel like they communicate anything much more useful than 
>> the current encode/decode.
> 
> If the unkeyed containers are FIFO then I suggest:
> 
> * a `QueuedEncodingContainer` protocol with `enqueue(_:)` methods,
> * a `QueuedDecodingContainer` protocol with `dequeue(_:)` methods.

These are FIFO, yes, but I don't think describing them as "queues" is helpful. 
They aren't used in the way you normally think of a queue being used; usually a 
queue allows enqueueing and dequeueing operations to be intermixed, but that's 
not the case here.

The more I think about it, the more I like `encodeNext(_:)` and 
`decodeNext(_:)`. They suggest that each call advances an internal position, 
but they don't waste a lot of time talking about a "start" or "end", or imply 
that there's a "front" or "back". Which value are you adding? The next one. 
Which are you decoding? The next one.

Thinking about it a little more, I'd suggest a couple more changes to it:

* Rename `isAtEnd` to `isEmpty`. That harmonizes with `Collection` APIs.

* Document `count` as returning the number of *remaining* elements, if known. 
That makes the `count` always useful.

* Possibly, make `decodeNext(_:)` (or `decode(_:)`) return `T?` and 
`decodeNextIfPossible(_:)` return `T??`, with the (outer) `nil` indicating that 
you've retrieved all of the elements. That would let you use a `while let` 
loop, which is a bit more idiomatic:

        while let elem = try container.decodeNext(Element.self) {
                append(elem)
        }

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to