fn double(x: Int): Int = x * 2

fn addTen(x: Int): Int = x + 10

fn square(x: Int): Int = x * x

fn negate(x: Int): Int = -x

let result1 = square(addTen(double(5)))

let result2 = addTen(double(addTen(double(3))))

fn process(n: Int): Int = square(addTen(double(n)))

let a = process(1)

let b = process(2)

let c = process(3)

fn clampPositive(x: Int): Int = if x < 0 then 0 else x

let clamped = clampPositive(double(-5))

fn increment(x: Int): Int = x + 1

let composed = square(increment(double(5)))

fn printResults(): Unit with {Console} = {
    Console.print("5 |> double |> addTen |> square = " + toString(result1))
    Console.print("Pipeline result2 = " + toString(result2))
    Console.print("process(1) = " + toString(a))
    Console.print("process(2) = " + toString(b))
    Console.print("process(3) = " + toString(c))
    Console.print("clamped = " + toString(clamped))
    Console.print("composed = " + toString(composed))
}

let output = run printResults() with {}
