#Part 2
class CartesianProduct
include Enumerable
def initialize(p1, p2)
@first = p1
@second = p2
end
def each
@first.each do |part1|
@second.each do |part2|
yield[part1, part2]
end
end
end
end
c = CartesianProduct.new([:a,:b], [4,5])
c.each { |elt| puts elt.inspect }
# [:a, 4]
# [:a, 5]
# [:b, 4]
# [:b, 5]
c = CartesianProduct.new([:a,:b], [])
c.each { |elt| puts elt.inspect }
# (nothing printed since Cartesian product
# of anything with an empty collection is empty)
I1BhcnQgMgoKY2xhc3MgQ2FydGVzaWFuUHJvZHVjdAogIGluY2x1ZGUgRW51bWVyYWJsZQogIAogIGRlZiBpbml0aWFsaXplKHAxLCBwMikgCiAgICBAZmlyc3QgPSBwMQogICAgQHNlY29uZCA9IHAyCiAgZW5kCiAgCiAgZGVmIGVhY2gKICAgIEBmaXJzdC5lYWNoIGRvIHxwYXJ0MXwKICAgICAgQHNlY29uZC5lYWNoIGRvIHxwYXJ0MnwKICAgICAgICB5aWVsZFtwYXJ0MSwgcGFydDJdCiAgICAgIGVuZAogICAgZW5kCiAgZW5kCmVuZAoKYyA9IENhcnRlc2lhblByb2R1Y3QubmV3KFs6YSw6Yl0sIFs0LDVdKQpjLmVhY2ggeyB8ZWx0fCBwdXRzIGVsdC5pbnNwZWN0IH0KIyBbOmEsIDRdCiMgWzphLCA1XQojIFs6YiwgNF0KIyBbOmIsIDVdCgpjID0gQ2FydGVzaWFuUHJvZHVjdC5uZXcoWzphLDpiXSwgW10pCmMuZWFjaCB7IHxlbHR8IHB1dHMgZWx0Lmluc3BlY3QgfQojIChub3RoaW5nIHByaW50ZWQgc2luY2UgQ2FydGVzaWFuIHByb2R1Y3QKIyBvZiBhbnl0aGluZyB3aXRoIGFuIGVtcHR5IGNvbGxlY3Rpb24gaXMgZW1wdHkp