#!/usr/bin/ruby

# Test scalar context (provided by the unary + operator).

var TimePiece = require('Time::Piece')

var d = TimePiece.strptime("2020-02-02", "%Y-%m-%d")
var a = [d.add(TimePiece.ONE_DAY)]
var b = +d.add(TimePiece.ONE_DAY)

assert_eq(a, [0, 0, 0, 3, 1, 120, 1, 33, 0])
assert_eq(b.strftime("%Y-%m-%d"), "2020-02-03")

var palindates = Enumerator({ |f|
    loop {
        f(d) if d.strftime("%Y%m%d").is_palindrome
        d = +d.add(TimePiece.ONE_DAY)
    }
})

assert_eq(palindates.first(2).map { .strftime("%Y-%m-%d") }, ["2020-02-02", "2021-12-02"])

do {
    func foo(n) {
        (n, n+1, n+2)
    }

    var a =  foo(42)    # first element
    var b = +foo(42)    # last element

    assert_eq(a, 42)
    assert_eq(b, 44)
}

do {
    require('Algorithm::Combinatorics')

    var data = %w(a b c)
    var iter = +%S<Algorithm::Combinatorics>.permutations(data)

    assert_eq(
        gather {
            while (var p = iter.next) {
                take(p)
            }
        },
    data.permutations)

    assert_eq([%S<Algorithm::Combinatorics>.permutations(data)], data.permutations)   # list context
}

do {
    require('Algorithm::Loops')

    var arr1 = %w(a b c)
    var arr2 = %w(x y z)
    var iter = +%S<Algorithm::Loops>.NestedLoops([arr1, arr2])

    assert_eq(
        gather {
            while (var *car = iter.call) {
                take(car.clone)
            }
        },
        [arr1, arr2].cartesian
    )

    assert_eq([%S<Algorithm::Loops>.NestedLoops([arr1, arr2], {|*a| a })], [arr1, arr2].cartesian)  # list context
}

say "** Test passed!"