My own Smalltalk library (and yes, I've tried to put it on github, I
don't know what I'm doing wrong)
includes Deque and BoundedDeque, both descendants of Collection.
Using addLast/removeLast gives you a stack (use #last for peeking)
Using addLast/removeFirst gives you a queue. (use #first for peeking)

(1) I am puzzled why there are separate FIFO and LIFO classes rather
than a single BoundedDeque.
     -- This has implications for performance.
(2) I am puzzled why #withCapacity: is used rather than #new:,
familiar from OrderedCollection.
    -- These two points together make it hard to just swap
OrderedCollection and ?IFOBuffer.
(3) I am puzzled why #clear is used instead of the familiar #removeAll.
    -- See note on question 2.
(4) I am extremely puzzled why ALL, like ALL, of the internals of the
data structure are exposed.
    Did encapsulation fall out of favour and I didn't get the memo?
(5) It looks as though calling #capacity: at the wrong time can
destroy the integrity of one of
     these containers, but there is nothing sayiing "don't do that".
(6) I am puzzled that they are not Collections.
(7) I am puzzled why trying to access an element in an empty buffer
does not signal
    a CollectionIsEmpty exception
    -- Is this related to (6)?

The structure, with two separate classes and key performance-essential
methods being
template methods, hurts performance by about a factor of two in my tests.

Now Pharo has a design MOOC and if Stephane Ducasse says "this is
great", these things
that puzzle me must be good design.  I would like to improve my
skills, so *why* is this good design?
(As it happens, I *have* had occasion to 'push' from both ends of a
single Deque.)

None of this is meant as criticism of the generosity or competence of
the authors.  It expresses
genuine puzzlement.  Like when I implemented deques I could not
imagine not making them
Collections.  Principle of Least Surprise and all that.  Maybe I
should be thinking differently.


On Fri, 27 Jun 2025 at 20:10, stephane ducasse via Pharo-users
<pharo-users@lists.pharo.org> wrote:
>
> Thanks this is great!
>
> On 18 Jun 2025, at 12:13, Alok via Pharo-users <pharo-users@lists.pharo.org> 
> wrote:
>
> Hello Everyone,
> We're excited to share a new addition to the pharo-containers. An efficient 
> Circular Buffer implementation, developed as part of Google Summer of Code 
> 2025 project under the mentorship of Gordana Rakic and Sebastian Jordan 
> Montaño.
>
> This package provides fixed-size buffers supporting both FIFO (queue-style) 
> and LIFO (stack-style) behavior. It’s designed for use cases such as 
> streaming data, undo/redo functionality, chat or browser history & more.
>
> You can find the repo here: Containers-Buffer
> The README includes usage examples, installation steps etc.
>
> Feedback, suggestions, and contributions are very welcome !
> ThankYou !
> Alok Pathak
> GSoC'25 Contributor
>
>
> Stéphane Ducasse
> http://stephane.ducasse.free.fr
> 06 30 93 66 73
>
> "If you knew today was your last day on earth, what would you do differently? 
> ....ESPECIALLY if, by doing something different, today might not be your last 
> day on earth.” Calvin & Hobbes
>
>
>
>
>

Reply via email to