#!/usr/bin/ruby

#
## The Ackermann function
#

class Ackermann {
    method A({ .is_zero }, n) {
        n + 1
    }

    method A(m, (0)) {
        self.A(m-1, 1)
    }

    method A(m, n) {
        self.A(m-1, self.A(m, n-1))
    }
}

var obj = Ackermann();
assert_eq(obj.A(3, 2), 29);


#
## The Fibonacci Nth term
#

class Fib {
    method nth(Number n { _ <= 1 } = 0) {
        return n
    }

    method nth(n) {
        self.nth(n-1) + self.nth(n-2)
    }
}

var f = Fib();
assert_eq(f.nth(), 0);
assert_eq(f.nth(12), 144);


#
## The Fibonacci Nth term (#2)
#

class Fib2 {
    method nth((0)) { 0 }
    method nth((1)) { 1 }
    method nth (n)  { self.nth(n-1) + self.nth(n-2) }
}

var f2 = Fib2();
assert_eq(f2.nth(12), 144);

say "** Test passed!";
