stevensonmt

stevensonmt

I ran into the following situation when trying to create a MapSet of MapSets yesterday. If you nest the MapSet.new() calls they get flattened. I don’t know if this is a bug or I am just unaware of the reason this should be the expected behavior. Does anyone have an explanation?

iex(1)> MapSet.new(MapSet.new([1,2]))
mapset<[1, 2]>
iex(2)> a = v(1)
mapset<[1, 2]>
iex(3)> MapSet.size(a)
2 # ← expected 1
iex(4)> MapSet.put(MapSet.new(), MapSet.new([1,2]))
mapset<[mapset<[1, 2]>]>
iex(5)> MapSet.size(v(4))
1 # ← this is what I wanted

Showing Posts 1 to 6

eksperimental

eksperimental

Then what you need is MapSet.new([MapSet.new([1,2])])

stevensonmt

stevensonmt OP

That works but it’s weird. I guess if the passed argument is Enumerable the MapSet.new() call iterates over each item in the passed argument to build the set. So in my original command it’s making a MapSet<[1,2]>, turning it into a list, iterating over that list, and putting each item into a MapSet<[1,2]>. I guess that makes sense. I guess I think it’s a little odd that MapSet.new requires that the passed arg be enumerable. Why is that? Would be nice to say MapSet.new(1) → MapSet<[1]>.

@spec new(Enum.t()) :: t
  def new(enumerable)

  def new(%__MODULE__{} = map_set), do: map_set

  def new(enumerable) do
    map =
      enumerable
      |> Enum.to_list()
      |> new_from_list([])

    %MapSet{map: map}
  end
eksperimental

eksperimental

The enumerable is converted to a list and then each element added to the map set. You can see its implementation here: elixir/lib/elixir/lib/map_set.ex at 14dff5c7613d241c29312d73ec1ae001a3c5f7af · elixir-lang/elixir · GitHub

In the case of passing a mapset, there’s an optimization, so no conversion is done.

eksperimental

eksperimental

If you want to create a map of one element, you wrap that element in a list like I did, but if Elixir would work as you suggest, if you want to create a map set of 5 elements, how would Elixir know that MapSet.new([1, 2, 3, 4, 5]) is a a map set of 5 elements or a map set of one element which is a list of length 5?

mudasobwa

mudasobwa

Creator of Cure

What do you mean if? MapSet.new/1 accepts enumerables only as it can be easily seen from the function spec.

Then it iterates through this Enumerable, dedups it and produces a MapSet from unique elements in this Enumerable.

stevensonmt

stevensonmt OP

I’m aware. The rest of the post includes “I think it’s a little odd that MapSet.new requires that the passed arg be enumerable.” @eksperimental explained why it obviously needs to be that way.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews