Oh I completely agree! I used MapSet because it has clean semantics for the
problem domain, I expect with small datasets there won't be any performance
difference. But looking at my code now I'm not using pop (because
`MapSet.pop/2` ecause this doesn't exist, so this may not be helpful to the
original discussion about `List.pop/2`

I apologize as I've taken this thread offtopic -- Nathan if it's helpful to
you my suggestion/selection implementation is here:
https://github.com/bikebrigade/dispatch/blob/main/lib/bike_brigade_web/live/rider_live/index.ex#L21-L90
. Happy to respond to direct emails about it if you have any questions!

Again sorry for veering us offtopic :)

On Tue, Mar 8, 2022 at 9:22 AM Ben Wilson <benwilson...@gmail.com> wrote:

> I would benchmark to make sure that you're actually gaining something. If
> you are relying on it to be small, then at that specific size a list might
> also just be fine, and you won't be relying on behavior that could change
> in a future release.
>
> On Monday, March 7, 2022 at 11:49:06 AM UTC-5 Max Veytsman wrote:
>
>> For what it's worth, I use MapSets for these kinds of autocompletion
>> suggestion lists in LiveView. It's worth noting that these aren't
>> guaranteed to preserve insertion order, and I'm relying on a implementation
>> detail that they will for a small number of keys.
>>
>> On Mon, Mar 7, 2022 at 10:51 AM h...@nathanmlong.com <
>> h...@nathanmlong.com> wrote:
>>
>>> Hmm. I can't give too much detail, but the basic context is a LiveView
>>> form where the user selects some ports and the form provides suggestions as
>>> they type. Eg, if they type `2` it will suggest `22 - SSH`, `25 - SMTP`,
>>> etc.
>>>
>>> The currently-selected ports are a list of integers. If `22` is already
>>> selected, the LiveView won't suggest it. So if the LiveView gets a message
>>> to deselect `22`, it tries to pop it out of the `selections` list. If the
>>> pop succeeds, the `suggestions` list can be updated to include port `22`
>>> again. If the pop doesn't succeed, we can ignore the message; we can't
>>> deselect a port that wasn't selected to start with.
>>>
>>> I can't combine `selected` and `suggested` (eg by flagging the
>>> suggestions which are also selected) because both collections can contain
>>> elements that the other doesn't contain; the user may select ports that are
>>> not in the suggestions list. And it's not practical to have a top-level
>>> list of every possible port and flag each as `selected`, `suggested`, or
>>> both, because there are are 65,535 possible ports.
>>>
>>> So the core of my use case is: I get a user message to remove an item
>>> from a list, and after attempting to remove it, I want to take a follow-up
>>> action only if the item was was actually in the list.
>>>
>>> On Friday, March 4, 2022 at 11:05:35 AM UTC-5 José Valim wrote:
>>>
>>>> Hi Nathan, thanks for the email. Can you please show some examples of
>>>> where they could be handy with some context around them? Thank you!
>>>>
>>>> On Fri, Mar 4, 2022 at 3:45 PM h...@nathanmlong.com <
>>>> h...@nathanmlong.com> wrote:
>>>>
>>>>> This is a modified version of what I proposed in
>>>>> https://github.com/elixir-lang/elixir/pull/11681
>>>>>
>>>>> Similar to `Map.pop/2` and and `Keyword.pop/2`, I propose adding
>>>>> `List.pop/2`.
>>>>>
>>>>> I also propose adding `List.find_and_pop/2`, which is more generalized
>>>>> since it takes a function.
>>>>>
>>>>> Here are possible implementations.
>>>>>
>>>>> ```elixir
>>>>> @doc """
>>>>> Returns and removes the first value matching `item` in the `list`.
>>>>>
>>>>> ## Examples
>>>>>    iex> List.pop([1, 2, 2, 3], 2)
>>>>>    {2, [1, 2, 3]}
>>>>>    iex> List.pop([1, 2, 3, 4], 20)
>>>>>    {nil, [1, 2, 3, 4]}
>>>>> """
>>>>> def pop(list, item) do
>>>>>   find_and_pop(list, &(&1 == item))
>>>>> end
>>>>>
>>>>> @doc """
>>>>> Returns and removes the first value matching `fun` in the `list`.
>>>>>
>>>>> ## Examples
>>>>>    iex> List.find_and_pop([1, 2, 3, 4], &(&1 > 2))
>>>>>    {3, [1, 2, 4]}
>>>>>    iex> List.find_and_pop([1, 2, 3, 4], &(&1 > 20))
>>>>>    {nil, [1, 2, 3, 4]}
>>>>> """
>>>>> def find_and_pop(list, fun) do
>>>>>   case Enum.find_index(list, fun) do
>>>>>     nil -> {nil, list}
>>>>>     i -> pop_at(list, i)
>>>>>   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/bdc98b8c-fc73-40d7-8287-eb0b5d3ea97en%40googlegroups.com
>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/bdc98b8c-fc73-40d7-8287-eb0b5d3ea97en%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-co...@googlegroups.com.
>>>
>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/elixir-lang-core/57bc38e4-2596-415c-8dbf-a235330d459an%40googlegroups.com
>>> <https://groups.google.com/d/msgid/elixir-lang-core/57bc38e4-2596-415c-8dbf-a235330d459an%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+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/fa78cd65-804d-4160-99fb-58d0e0994ddan%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-core/fa78cd65-804d-4160-99fb-58d0e0994ddan%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+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAD8aQu%2BwvCZVVo6vf%2B6mCrEJgVgz2ywaKipweYuSu6LZMtH-Pw%40mail.gmail.com.

Reply via email to