Wouldn't this suffice? ```
defguard is_real_map(x) when is_map(x) and not is_struct(x) ``` On Tue, Jan 03, 2023 at 11:34 PM, Andrey Yugai < andr...@pm.me > wrote: > > There's also an option of pattern matching any struct, not exactly a > guard, but changing your code a bit shouldn't be a problem > > > ``` > > > def foo(%_{} = _struct), do... > > > def foo(map) when is_map(map), do... > > > ``` > > > > > > > > > > > > > Sent from Proton Mail mobile > > > > > > > > -------- Original Message -------- > On 4 Jan 2023, 04:03, Jay Rogov < rogovyaroslav@ gmail. com ( > rogovyaros...@gmail.com ) > wrote: >> >> Also note that there's is_map_key/2 guard that serves the same purpose >> when used as `is_map_key(arg, :__struct__)`, allowing only maps but not >> structures: >> https:/ / hexdocs. pm/ elixir/ 1. 14. 2/ Kernel. html#is_map_key/ 2 ( >> https://hexdocs.pm/elixir/1.14.2/Kernel.html#is_map_key/2 ) >> >> On Thursday, 22 December 2022 at 4:22:30 pm UTC+1 halos...@gmail.com >> wrote: >> >> >>> I think that this is an interesting idea, but as Enumerable is a protocol, >>> it is possible to implement enumerability for any given struct, as >>> `MapSet` is enumerable. >>> >>> >>> This SO answer ( >>> https://stackoverflow.com/questions/39609255/how-can-i-check-whether-the-protocol-is-implemented#39609295 >>> ) suggests using the Protocol. impl_for/ 1 ( http://Protocol.impl_for/1 ) >>> callback >>> instead. It can’t be used as a guard, but it gives a more accurate answer. >>> >>> >>> >>> Whether `is_real_map/1` (or a different name) is more readable than `when >>> is_map(term) and not is_struct(term)`, I can’t say because if I need to >>> handle structs differently, I would generally use two different function >>> heads (`def foo(term) when is_struct(term) do term |> Map.from_struct() |> >>> foo() end` and `def foo(term) when is_map(term) do … end`). >>> >>> >>> -a >>> >>> >>> On Thu, Dec 22, 2022 at 1:25 AM vtm < vtmil... @ gmail. com > wrote: >>> >>> >>>> hey all, thanks for you work on such a beautiful lang. >>>> >>>> >>>> Small proposal. People sometimes get confused about data structures which >>>> based on maps. >>>> for instance: >>>> ``` >>>> iex(3)> {:ok, datetime} = DateTime. now ( http://datetime.now/ ) >>>> ("Etc/UTC") >>>> >>>> {:ok, ~U[2022-12-22 05:53:36.228720Z]} >>>> iex(5)> is_struct(datetime) >>>> true >>>> iex(6)> is_map(datetime) >>>> >>>> true >>>> ``` >>>> but here i got an error >>>> ```elixir >>>> iex(11)> Enum.each(datetime, &Function.identity/1) >>>> ** (Protocol.UndefinedError) protocol Enumerable not implemented for >>>> ~U[2022-12-22 05:53:36.228720Z] of type DateTime (a struct) >>>> >>>> ``` >>>> >>>> >>>> i have in a codebase in function definition something like >>>> `where is_map(map_name) and not is_struct(map_name)` >>>> what i suggest to do is to create a macro `is_real_map` to check only real >>>> maps as a key-value storage with Enumerable impl >>>> ```elixir >>>> @doc """ >>>> Returns true if `term` is a map and not is struct; otherwise returns >>>> `false`. >>>> >>>> Allowed in guard tests. >>>> >>>> ## Examples >>>> >>>> iex> is_real_map(%{oi: :blz}) >>>> true >>>> >>>> iex> is_real_map(URI.parse("/")) >>>> false >>>> >>>> """ >>>> @doc since: "1.16.0", guard: true >>>> defmacro is_real_map(term) do >>>> case __CALLER__.context do >>>> nil -> >>>> quote do >>>> case unquote(term) do >>>> %_{} -> false >>>> %{} -> true >>>> _ -> false >>>> end >>>> end >>>> >>>> :match -> >>>> invalid_match!(:is_real_map) >>>> >>>> :guard -> >>>> quote do >>>> is_map(unquote(term)) and not :erlang.is_map_key(:__struct__, >>>> unquote(term)) >>>> end >>>> end >>>> end >>>> >>>> ``` >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>> >>> >>> >>>> -- >>>> You received this message because you are subscribed to the Google Groups >>>> "elixir-lang-core" group. >>>> To unsubscribe from this group and stop receiving emails from it, send an >>>> email to elixir-lang-co... @ googlegroups. com. >>>> To view this discussion on the web visit https:/ / groups. google. com/ d/ >>>> msgid/ elixir-lang-core/ >>>> 1f26dae3-9c67-446b-91d0-51bf1c5f3666n%40googlegroups. >>>> com ( >>>> https://groups.google.com/d/msgid/elixir-lang-core/1f26dae3-9c67-446b-91d0-51bf1c5f3666n%40googlegroups.com?utm_medium=email&utm_source=footer >>>> ). >>>> >>> >>> >>> >>> >>> >>> -- >>> Austin Ziegler • halos... @ gmail. com • aus... @ halostatue. ca >>> http:/ / www. halostatue. ca/ ( http://www.halostatue.ca/ ) • http:/ / >>> twitter. >>> com/ halostatue ( http://twitter.com/halostatue ) >>> >> >> >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to elixir-lang-core+unsubscribe@ googlegroups. com ( >> elixir-lang-core+unsubscr...@googlegroups.com ). >> To view this discussion on the web visit https:/ / groups. google. com/ d/ >> msgid/ elixir-lang-core/ >> 90368793-c5b7-47d2-9dfd-f0ee6221f387n%40googlegroups. >> com ( >> https://groups.google.com/d/msgid/elixir-lang-core/90368793-c5b7-47d2-9dfd-f0ee6221f387n%40googlegroups.com?utm_medium=email&utm_source=footer >> ). >> >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to elixir-lang-core+unsubscribe@ googlegroups. com ( >> elixir-lang-core+unsubscr...@googlegroups.com ). >> To view this discussion on the web visit https:/ / groups. google. com/ d/ >> msgid/ elixir-lang-core/ >> gCO3cNmTH8s-grC61yt_KsSqoJ5CCZzYiPqA5X0S3Q1ZgoZ8j7usrix2xMFr-iGAdSl5X_N1NM-mvniP4KoOnkD1bRsrmtMoln_80Jk4v4A%3D%40pm. >> me ( >> https://groups.google.com/d/msgid/elixir-lang-core/gCO3cNmTH8s-grC61yt_KsSqoJ5CCZzYiPqA5X0S3Q1ZgoZ8j7usrix2xMFr-iGAdSl5X_N1NM-mvniP4KoOnkD1bRsrmtMoln_80Jk4v4A%3D%40pm.me?utm_medium=email&utm_source=footer >> ). > > > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/lch6yerj.29ded06c-8c2a-47da-8be9-b3154eebbf76%40we.are.superhuman.com.