I’ve had this same though about using atoms as markers. It’s a pretty common pattern in Erlang/OTP from what I can see, but the scenario you describe seems likely, especially when using common atoms like :ok (or nil).
I liked your suggestion about following the get/fetch/fetch! paradigm in Map and elsewhere, so I added a couple functions to the API:
fetch/1andfetch_r/1will return the tuple{value, updated_queue}if there are elements on the front or back of the queue, respectively, or:errorotherwisefetch!/1andfetch_r!/1will return the tuple{value, updated_queue}if there are elements on the front or back of the queue, respectively, or raiseYaq.EmptyQueueErrorotherwise
I also added a default value specification for dequeue/2 and dequeue_r/2 to follow the pattern from get.
You can only enumerate and collect from front to back, but you can reverse the queue in constant time with Yak.reverse/1, so I think it is a fair compromise.






















