windexoriginal
Collectable for error tuple, a good idea?
I often find myself with code like this when applying a function that returns error tuples to an enumerable:
is_ok? = fn x ->
if x < 5, do: {:ok, x}, else: {:error, "too big"}
end
Enum.reduce_while(1..5, {:ok, []}, fn v, {:ok, vs} ->
case is_ok?.(v) do
{:ok, v} -> {:cont, {:ok, [v | vs]}}
{:error, _} = e -> {:halt, e}
end
end)
But, if I write a simple collectable implementation for Tuple, I can write this instead:
for x < - 1..5, into: {:ok, []}, do: is_ok.(x)
I much prefer the second: it’s short, it’s clear, and I don’t mind too much that it iterates the whole enumerable every time. Is implementing a protocol for convenience on a built in type like this a good long term decision?
First Post!
Asd
If you implement collectable and you do
for x < - 1..1000000, into: {:ok, []}, do: is_ok.(x)
You will perform 999995 unnecessary operations
Most Liked
FlyingNoodle
I much, much prefer the first version. I can immediately see what happens and understand.
I always prefer clarity over brevity. Always. Every. Single. Time.
al2o3cr
My reading was that the Collectable implementation would check the shape of the block’s return value:
- if it’s
{:ok, value}and the accumulator is{:ok, values}then the new accumulator is{:ok, values ++ [value]}(or equivalent with reverse-at-the-end for performance) - if it’s
{:ok, value}and the accumulator is anything else then the new accumulator is unchanged - if it’s
{:error, e}then the new accumulator is{:error, e}
I don’t think I’d personally choose this approach, since it requires defining Collectable for all tuples but only actually cares about specific shapes
Last Post!
dmitrykleymenov
Yeah, doesn’t seem like Collectable any more, significantly different from other implementations.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









