#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)
I1BhcnQgMgoKY2xhc3MgQ2FydGVzaWFuUHJvZHVjdAogIGluY2x1ZGUgRW51bWVyYWJsZQogIAogIGRlZiBpbml0aWFsaXplKHAxLCBwMikgCiAgICBAZmlyc3QgPSBwMQogICAgQHNlY29uZCA9IHAyCiAgZW5kCiAgCiAgZGVmIGVhY2gKICAgIEBmaXJzdC5lYWNoIGRvIHxwYXJ0MXwKICAgICAgQHNlY29uZC5lYWNoIGRvIHxwYXJ0MnwKICAgICAgICB5aWVsZChbcGFydDEsIHBhcnQyXSkKICAgICAgZW5kCiAgICBlbmQKICBlbmQKZW5kCgpjID0gQ2FydGVzaWFuUHJvZHVjdC5uZXcoWzphLDpiXSwgWzQsNV0pCmMuZWFjaCB7IHxlbHR8IHB1dHMgZWx0Lmluc3BlY3QgfQojIFs6YSwgNF0KIyBbOmEsIDVdCiMgWzpiLCA0XQojIFs6YiwgNV0KCmMgPSBDYXJ0ZXNpYW5Qcm9kdWN0Lm5ldyhbOmEsOmJdLCBbXSkKYy5lYWNoIHsgfGVsdHwgcHV0cyBlbHQuaW5zcGVjdCB9CiMgKG5vdGhpbmcgcHJpbnRlZCBzaW5jZSBDYXJ0ZXNpYW4gcHJvZHVjdAojIG9mIGFueXRoaW5nIHdpdGggYW4gZW1wdHkgY29sbGVjdGlvbiBpcyBlbXB0eSk=