defimpl Altstd.Compact, for: MapSet do @moduledoc since: "0.1.0" @doc since: "0.1.0" @spec resolve(MapSet.t(), keyword) :: Altstd.Compact.resolution_t() def resolve(object, opts \\ []) do case MapSet.size(object) do 0 -> {:reject, object} _any -> compact_mapset = object |> Enum.reduce(MapSet.new([]), fn value, acc -> resolution = value |> Altstd.Compact.resolve(opts) case resolution do {:resolve, resolved_value} -> acc |> MapSet.put(resolved_value) {:reject, _any} -> acc :reject -> acc resolved_value -> acc |> MapSet.put(resolved_value) end end) case MapSet.size(compact_mapset) do 0 -> {:reject, object} _any -> {:resolve, compact_mapset} end end end @doc since: "0.1.0" @spec cast(MapSet.t(), keyword) :: Altstd.Compact.t() def cast(object, opts \\ []) do resolution = object |> Altstd.Compact.resolve(opts) case resolution do {:resolve, resolved_value} -> resolved_value |> List.wrap() {:reject, _any} -> [] :reject -> [] resolved_value -> resolved_value |> List.wrap() end end end