Here are some use cases that having a reducer would help with:

```elixir
Enum.zip([:a, :b, :c], [1, 2, 3], %{}, fn k, val, acc -> Map.put(acc, k, 
val)  end)
# %{a: 1, b: 2, c: 3}

def zip_into_map(left, right) do
  Enum.zip(left, right, %{}, fn k, val, acc -> Map.put(acc, k, val)  end)
end

csv_headers = ["id", "date", "whatever"]

Enum.map(csv_rows, fn row -> 
  zip_into_map(csv_headers, row)
end)

dot_product = 
  Enum.zip([1, 2], [3, 4], [], fn l, r, acc -> [ l * r | acc] end)
  |> Enum.reverse

def zip_merge_values(left, right) do
  Enum.zip(left, right, %{}, fn 
    {key, left_val}, {key, right_val}, acc -> 
      Map.put(acc, key, left_val ++ right_val)

    {left_key, left_val}, {right_key, right_val}, acc -> 
      Map.merge(acc, %{left_key => left_val, right_key => right_val})
  end)
end

zip_merge_values(%{a: [1], c: [5]}, %{a: [2], b: [7])
# %{a: [1, 2], b: [7] c: [5]}

Enum.zip_with(["a", "key", "list"], Stream.repeatedly(fn -> 10 end), %{}, 
fn k, v, acc ->
  Map.merge(acc, {k, v})
end)

# => %{"a" => 10, "key" => 10, "list" => 10}
```

Though I think if we are really going for it if you had a Zippable protocol 
a la Eumerable and defined Zippable.reduce_while you'd get a lot of 
functions for free I suspect.

Best

Adam


On Wednesday, February 3, 2021 at 5:59:34 AM UTC José Valim wrote:

> I think zip_with is still valuable as is because a zip_with without an 
> accumulator can be streamable (i.e. in the Stream module) but a zip_with 
> with an accumulator cannot. We may be looking at a zip_reduce in the future 
> though, given use cases are provided. :)
>
> On Tue, Feb 2, 2021 at 11:29 PM [email protected] <[email protected]> 
> wrote:
>
>> How embarrasing I typo'd the subject. It should read Should zip / 
>> zip_with have a reducer?
>>
>> Best
>>
>> Adam
>>
>> On Tuesday, February 2, 2021 at 10:27:49 PM UTC [email protected] wrote:
>>
>>> Hello! 
>>>
>>> I was thinking about zip_with/3 et al. (don't judge me I'm in a 
>>> lockdown). 
>>>
>>> Currently they work by returning a list, but would it not make more 
>>> sense for it to take an accumulator?
>>>
>>> ```elixir
>>> Enum.zip_with([1, 2], [3, 4], %{}, fn left, right, acc -> Map.put(acc, 
>>> left, right) end)
>>> %{ 1 => 3, 2 => 4 }
>>>
>>> Enum.zip_with([1, 2], [3, 4], [], fn left, right, acc -> [{left, right} 
>>> | acc] end)
>>> [{1, 3}, {2, 4}]
>>> ```
>>> If so... I guess it also opens to door for a zip_while.
>>>
>>> Am I mad? Has science gone too far?
>>>
>>> Best
>>>
>>> Adz
>>>
>>>
>>> -- 
>> 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/468649a3-7e6f-4214-99d8-6e8ef5e6d72an%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/468649a3-7e6f-4214-99d8-6e8ef5e6d72an%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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/47214770-475d-4499-a13e-3d7077d4e614n%40googlegroups.com.

Reply via email to