NullOranje
While working on a work project, I found I needed a more Elixir-like queue versus the Erlang :queue module. So I decided to write one. I liked what I did, so I’m sharing it with others.
Yaq (Yet another queue) is a double-ended queue that supports both the Enumerable and Collectable protocols. I wanted something I could use with the pipe operator, since with my use case I found myself having to write a lot of functions to make :queue work correctly.
This is my first library I’m sharing with the community. I not only wanted a library I could use in my day job, but something I could take an opportunity to learn how to “do things right” so with regards to Elixir.
Source code is available on Github: GitHub - NullOranje/yaq: Yet another queue module for Elixir · GitHub
Hex package: yaq | Hex
Documentation: API Reference — yaq v1.2.0
Any and all feedback is welcome.
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #elixirconf-eu
- #metaprogramming
- #hex










Showing Posts 13 to 4- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
NullOranje
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(ornil).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.EmptyQueueErrorotherwiseI also added a default value specification for
dequeue/2anddequeue_r/2to 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.mat-hek
Oh I haven’t noticed that Yaq is not a wrapper around :queue, that’s interesting. Speaking of efficiency, do you plan to do some benchmarks? Would be nice to see how it performs compared to :queue.
NobbZ
nilis just an atom, specialcased by the parser to be able to leave off the colon.In my opinion having marker or value is deemed to fail anyway. What if is I want to insert exactly the value you use as marker?
Please use a tagged tuple or at least provide an API similar to
Mapget/fetch/fetch! to be able to differentiate when necessary.Also when you say, it’s collectable and enumerable, in which direction? Is there a way to collect/enumerate in the opposite direction?
NullOranje
I did, but because it is mostly wrapper for
:quque, it has some of the same issues.:quque(deliberately) does not track the size of the queue, so that is an O(N) operation, which was too slow for my use case.NullOranje
That’s my fault. The repo is public now.
This was a deliberate choice. I can show the size of the
It probably shouldn’t be.
Mostly because I’m still figuring out how typespecs work.
This is probably an artifact of some thinking. The
:queuemodule I drew inspiration from returned an:emptyatom if you tried to dequeue an empty list. I guess I didn’t like the specific atom, so I think that’s why it became a nil. My own limited knowledge probably had me explicitly describe this case.Thinking back, I’m wondering if an atom would be a better empty queue return value.
mat-hek
Hmm, seems very similar to Qex. Have you tried that one?
NobbZ
Yes, I’m pretty sure a
@typedocwould help.thojanssens1
Sorry, in this specific case it makes no sense to me too. I thought you meant as a general rule that
nil | termis useless, astermincludesnil; but I thought maybe sometimes it is useful to know that the library can expectnil.Again, in this case I don’t see why this needs to be clarified indeed.
NobbZ
What if is I want to store
nil? Is that not allowed?thojanssens1
Thank you for sharing your work. By the way, are there other libraries like
yaq? If so, what are the main differences?What happened to the GitHub repo?
Isn’t it interesting to know whether the passed atom may be expected to be
nilor not?