#!/usr/bin/ruby

#
## Ranges as objects
#

class RangeExample {

    method count(RangeNum r=(1..^10)) {
        r.each { |i|
            say i;
        }
    }
}

var obj = RangeExample();

obj.count();                # uses the default range
obj.count(1..^3);           # passes a range from 1 to 3

# Make the sure the equality works
assert(1..^3 == 1..^3);
assert("a".."d" == "a".."d");

# Number range
assert_eq(RangeNum(1, 10), 1..10);
assert_eq(RangeNum(10), ^10);
assert_eq(RangeNum(1, 10, 2), range(1, 10, 2));

# String range
assert_eq(RangeStr("a", "z"), "a".."z");
assert_eq(RangeStr("z"), ^"z");
assert_eq(RangeStr("z"), range("a", "z"));
assert_eq(RangeStr("z", "a", -1), flip("a".."z"));