#!/usr/bin/ruby

func increment(n) {
    n+1
}

func double(n) {
    2*n
}

func triple(n) {
    3*n
}

var a = increment(double(triple(42)))
var b = (42 |> triple |> double |> increment)
var c = [triple, double, increment].reduce({|a,b| b(a) }, 42)

assert_eq(a, b)
assert_eq(a, c)

func foo(a,b) { a + b }

# Pass additional arguments to the given function
assert_eq(42 |> (foo, 3), 45)

# Call a method on the self-object, with optional arguments
assert_eq([1,2,3] |> (:map, { _*_ }), [1, 4, 9])

assert_eq(42 |> [:ipow, 3], 42**3)
assert_eq(42 |> (:ipow, 3), 42**3)

assert_eq(42 |> (:ipow, 6) |> :icbrt, 42**2)
assert_eq(42 |> (:ipow, 6) |> [:icbrt], 42**2)
assert_eq(42 |> (:ipow, 6) |> {.icbrt}, 42**2)
assert_eq(42 |> (:ipow, 6) |> (:iroot, 3), 42**2)
assert_eq(42 |> (:ipow, 6) |> [:iroot, 3], 42**2)
assert_eq(42 |> [:ipow, 6] |> [:iroot, 3], 42**2)

say "** Test passed!"