Erlang Thursday – ordsets:intersection/2

Today’s Erlang Thursday looks some more at that ordsets module and covers ordsets:intersection/2.

ordsets:intersection/2 takes two ordered sets and returns a new ordered set that is the intersection of the two ordered sets provided. For those who don’t have a background wth set theory, all a set intersection is is the set of items that all the sets we are intersecting have in common.

OrderedSet1 = ordsets:from_list([1, 2, 1, 3, 2, 4, 4, 9]).
OrderedSet2 = ordsets:from_list([1, 3, 5, 7, 9]).
ordsets:intersection(OrderedSet1, OrderedSet2).
ordsets:intersection(OrderedSet2, OrderedSet1).

Because ordsets:intersection/2 looks for the common elements in the ordered sets, it is commutative, and as we see above, we get the same result regardless of which order we pass in the two ordered sets as arguments.

If there are no items in common, the returned result is an empty ordered set (really an empty list, but see last week’s post on ordsets:union/2 on the dangers of just using a list as a ordered set).

Evens = ordsets:from_list(lists:seq(2, 20, 2)).
Odds = ordsets:from_list(lists:seq(1, 20, 2)).
ordsets:intersection(OrderedSet2, ordsets:new()).
ordsets:intersection(Evens, Odds).

Erlang also provides ordsets:intersection/1, that takes a list of ordered sets as its argument, and returns the intersection of all the ordered sets in that list.

OrderedSet3 = ordsets:from_list([1, 1, 2, 3, 5, 8]).
ordsets:intersection([Evens, Odds, OrderedSet1]).
ordsets:intersection([Odds, OrderedSet2, OrderedSet1]).
ordsets:intersection([Evens, OrderedSet1, OrderedSet3]).
ordsets:intersection([Odds, OrderedSet1, OrderedSet3]).