Thanks, James. Weirdly, I was thinking there might be that form of `Enum.reduce/2`, looked for it in the docs, and somehow completely skimmed past it! I'll definitely use that, though.
On Mon, Jun 26, 2017 at 4:01 PM, James Fish <[email protected]> wrote: > Hi Myron, > > I understand the convenience of a `MapSet.intersection/1` but there is > also `Enum.reduce/2`, which is very suitable for this use case - when the > accumulator is the same type as the elements of the enumerable and the > first element would become the accumulator. > > James > > On 26 June 2017 at 23:50, Myron Marston <[email protected]> wrote: > >> I have a list of MapSets, and I want to find the intersection of all of >> them. When I’ve wanted to find the union of a list of MapSets, it’s felt >> natural to use Enum.reduce: >> >> Enum.reduce(list_of_sets, MapSet.new, &MapSet.union/2) >> >> To find the intersection of a list of MapSets, I wanted to use the same >> technique: >> >> Enum.reduce(list_of_sets, MapSet.new, &MapSet.intersection/2) >> >> …but that does not work, because the intersection of an empty set with >> another set is the empty set — so this reduction will always produce the >> empty set, regardless of what list_of_sets is. In fact, the starting >> accumulator you need is the union of all the given sets. But of course, >> that would be an inefficient way to go about it, as you’d reduce the list >> twice (once to compute the union, then again to compute the intersection, >> using the union as the initial accumulator). Instead, you should use a >> different technique: >> >> [initial_set | rest] = list_of_setsEnum.reduce(rest, initial_set, >> &MapSet.intersection/2) >> >> While that’s not too bad, it took me some time to figure out why my >> initial reduction attempt did not work, and there’s no simple way to >> provide an initial accumulator that lets you reduce over the whole list. >> >> One solution would be to introduce MapSet.intersection/1. Given an >> enumerable of sets, it would compute the intersection of all of them. This >> is similar to the fact that we have both Enum.concat/2 (which concats >> two lists), and Enum.concat/1 (which, given an enumerable of >> enumerables, concats them in to a single list). If we introduce >> MapSet.intersection/1, we may also want MapSet.union/1 for parity. >> >> Thoughts? >> Myron >> >> >> -- >> 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/ms >> gid/elixir-lang-core/924446b6-9a96-4eb0-8ba4-2d47509190f3% >> 40googlegroups.com >> <https://groups.google.com/d/msgid/elixir-lang-core/924446b6-9a96-4eb0-8ba4-2d47509190f3%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to a topic in the > Google Groups "elixir-lang-core" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/elixir-lang-core/hk1_GoHgA-g/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/elixir-lang-core/CA%2BibZ9-P7%3D3Ee1Cinex9UHj8hy3gNGWW4n2J9Q > gfjKX7g1DbWA%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CA%2BibZ9-P7%3D3Ee1Cinex9UHj8hy3gNGWW4n2J9QgfjKX7g1DbWA%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- 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/CADUxQmtdQ0J9AXLVn2aaNNPO2sujpc5_1FRNSM_aRae-x9ivLA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
