// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package lambdas_kstyle_trivial

import lambdas_kstyle_trivial.inner.testInner

private var COUNT = 11

private fun next() = "${COUNT++}"

fun consumeEmpty(l: () -> String) = l()
fun consumeOne(l: (x: String) -> String): String = l(next())
fun consumeTwo(l: (x: String, y: String) -> String): String = l(next(), next())
fun consumeThree(l: (x: String, y: String, z: String) -> String) = l(next(), next(), next())
fun consumeTwentyTwo(l: (v0: String, v1: String, v2: String, v3: String, v4: String,
                         v5: String, v6: String, v7: String, v8: String, v9: String,
                         v10: String, v11: String, v12: String, v13: String, v14: String,
                         v15: String, v16: String, v17: String, v18: String, v19: String,
                         v20: String, v21: String) -> String) = l(
        next(), next(), next(), next(), next(), next(), next(), next(), next(), next(), next(),
        next(), next(), next(), next(), next(), next(), next(), next(), next(), next(), next())

fun main(args: Array<String>) {
    test()
    testInner()
    testPrimitive()
    testUnit()
}

private fun test() {
    testStateless()
}

private fun testStateless() {
    println(consumeEmpty { "first empty" })
    println(consumeEmpty { "second empty" })

    println(consumeOne { _ -> "first single" })
    println(consumeOne { _ -> "second single" })
    println(consumeOne { _ -> "third single" })
    println(consumeOne { x ->
        try {
            throw RuntimeException("exception#$x")
        } catch (e: RuntimeException) {
            "caught: ${e.message}"
        } catch (e: Exception) {
            "NEVER"
        }
    })
    println(consumeOne { x -> x })

    println(consumeTwo { x, y -> x + "-" + y })

    println(consumeThree { x, y, z -> x + y + z })
    println(consumeThree { _, _, _ -> "one-two-three" })

    println(consumeTwentyTwo { _, _, _, _, _, _, _, _, _, _, _,
                               _, _, _, _, _, _, _, _, _, _, _ ->
        "one-two-...-twentythree"
    })
    println(consumeTwentyTwo { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
                               v12, v13, v14, v15, v16, v17, v18, v19, v20, v21 ->
        v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9 + v10 + v11 +
                v12 + v13 + v14 + v15 + v16 + v17 + v18 + v19 + v20 + v21
    })
}

private fun consumePrimitive(i: Int, l: (Int, Short) -> Int) = l(i, 5)

private fun testPrimitive() {
    println(consumePrimitive(1, { x, y -> x }))
    println(consumePrimitive(2, { x, y -> y.toInt() }))
    println(consumePrimitive(3, { x, y -> x + y }))
    println(consumePrimitive(4, { x, y -> x * y }))
    val l: (Int, Short) -> Int = { x, y -> x / y }
    println(l(100, 20))
}

private fun consumeUnit(i: Int, l: (Int, Short) -> Unit) = l(i, 10)

private fun testUnit() {
    println(consumeUnit(11, { x, y -> println() }))
    println(consumeUnit(12, { x, y -> println(y) }))
    println(consumeUnit(13, { x, y -> println(x) }))
    println(consumeUnit(14, { x, y -> println("$x -- $y") }))
}

