// 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") }))
}
