Yes, please give it a try! On Sat, Mar 20, 2021 at 4:18 PM Adam Lancaster <a...@a-corp.co.uk> wrote:
> Awesome, yea exactly. > > Ah, i wondered if you would come up with a use case in Nx. > > I’d love to give this a stab if that’s okay so I’ll get a pr together. > > Adz > > On Sat, 20 Mar 2021 at 15:15, José Valim <jose.va...@dashbit.co> wrote: > >> Thanks, I also needed zip_reduce a couple days ago while working on Nx, >> so zip_reduce is appreciated. The cool thing is that we can also implement >> both zip_with and zip on top of zip_reduce, so it shouldn’t make the code >> more complex either. >> >> A PR is welcome! >> >> >> >> On Sat, Mar 20, 2021 at 15:10 ad...@a-corp.co.uk <a...@a-corp.co.uk> >> wrote: >> >>> 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 ad...@a-corp.co.uk <ad...@a-corp.co.uk> >>>> 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 ad...@a-corp.co.uk >>>>> 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 elixir-lang-co...@googlegroups.com. >>>>> 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 elixir-lang-core+unsubscr...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/elixir-lang-core/47214770-475d-4499-a13e-3d7077d4e614n%40googlegroups.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/47214770-475d-4499-a13e-3d7077d4e614n%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/CAGnRm4Km4hiN1CB%3DfTKAsnyo1jf_tT%3D1r8pmx%2BQqw_mPVsip2A%40mail.gmail.com >> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Km4hiN1CB%3DfTKAsnyo1jf_tT%3D1r8pmx%2BQqw_mPVsip2A%40mail.gmail.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/CADwgC_CShve52pNXJCzbj8ERLekUW7PYSMtKck0yx8j8Zh4tbw%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CADwgC_CShve52pNXJCzbj8ERLekUW7PYSMtKck0yx8j8Zh4tbw%40mail.gmail.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/CAGnRm4%2BX8X9Lk8fW8xOe3qpcF-G8zsKwVUVixtu6GULsofQoLA%40mail.gmail.com.