lib/ecto/map_set.ex

defmodule Rivet.Utils.Ecto.MapSet do
  @moduledoc """
  Custom Type to support MapSet

  Contributor: Brandon Gillespie
  """
  @behaviour Ecto.Type

  @type t :: MapSet.t()

  def type, do: MapSet

  def cast(%MapSet{} = ms), do: ms
  def cast(list) when is_list(list), do: MapSet.new(list)
  def cast(_), do: :error

  def load(%MapSet{} = ms), do: ms
  def load(ms) when is_list(ms), do: {:ok, cast(ms)}
  def load(_), do: :error

  # only support virtual for now
  def dump(%MapSet{} = ms), do: {:ok, MapSet.to_list(ms)}
  def dump(_), do: :error

  def embed_as(_), do: :self
  def equal?(a, b), do: MapSet.equal?(a, b)
end