#!/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!"