Thanks Greg, I was indeed missing something. The impl_for function covers
all my current use cases.

Em sáb, 26 de set de 2020 20:31, Greg Vaughn <[email protected]> escreveu:

> Each protocol module has an `impl_for/1` function that returns the
> implementation module or nil which works in a truthy/falsey check. So for
> example:
>
> iex(26)> String.Chars.impl_for("foo")
> String.Chars.BitString
> iex(27)> String.Chars.impl_for({:foo})
> nil
>
> More details here
> https://hexdocs.pm/elixir/1.10.4/Protocol.html#module-reflection
>
> -Greg Vaughn
>
> > On Sep 26, 2020, at 5:25 PM, [email protected] <
> [email protected]> wrote:
> >
> > Currently we have in the stdlib Protocol.assert_impl!/2 that raises an
> exception if the given module does not implement the protocol.
> >
> > I think would be nice if we had a function with a similar behavior, used
> to check if the module implements a protocol, but return true or false.
> >
> > The use case that I have in mind, to use this function, is when
> serializing values that may be structs would be useful to just add a simple
> if/else to check if it implements a behavior like String.Chars or
> Enumerable.
> >
> > To implement this kind of functionality today I would need to try/rescue.
> >
> > # enumerable
> > def serialize(data) when is_map(data) do
> >   data
> >   |> Enum.map(fn {key, value} -> {serialize_key(key), serialize(value)}
> end)
> >   |> Enum.into(%{})
> > rescue
> >   Protocol.UndefinedError -> serialize_struct(value)
> > end
> >
> > # String.Chars
> > def serialize_string(%mod{} = value)
> >   try do
> >     Protocol.assert_impl!(String.Chars, mod)
> >     to_string(value)
> >   rescue
> >     Protocol.UndefinedError -> serialize_struct(value)
> >   end
> > end
> >
> >
> > Does it makes sense? Am I missing something? A predicate function to
> check if a protocol is implemented would be something acceptable in the
> stdlib?
> >
> > --
> > 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 [email protected].
> > To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/6830a5fa-9989-433e-a7e7-24d5537ae5f0n%40googlegroups.com
> .
>
> --
> 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 [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/984C6D7D-0E6A-423C-9B0E-0D545FE0CFED%40gmail.com
> .
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CANUU5buifsGLK%3DG-9nMqTX4nehAWdc50WAv3qpzuTHQDEqk1PA%40mail.gmail.com.

Reply via email to