// 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_jstyle_trivial

import lambdas_jstyle_trivial.inner.testInner

private var COUNT = 0

fun nextInt() = COUNT++

fun next() = "${nextInt()}".padStart(3, '0')

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

private fun test() {
  test1(nextInt(), nextInt(), nextInt(), nextInt())
  test2(next(), next(), next())
  test3a(next(), next(), next())
  test3a(next(), Local(next()), Local(Local(next())))
  test3b(next(), next(), next())
  test3b(next(), Local(next()), Local(next()))
}

private data class Local<out T>(val id: T)

private fun test1(c0: Int, c1: Int, c2: Int, c3: Int) {
  Lambdas.acceptIntConsumer({ println("{${next()}:$it}") }, nextInt())
  Lambdas.acceptIntConsumer({ println("{${next()}:$it}") }, nextInt())

  Lambdas.acceptStringConsumer({ println("${next()}:{$it}:{$c0}") }, next())
  Lambdas.acceptStringConsumer({ println("${next()}:{$it}:{$c0}") }, next())

  Lambdas.acceptGenericConsumer({ println("${next()}:{$it}:{$c0}:{$c1}") }, next())
  Lambdas.acceptGenericConsumer({ println("${next()}:{$it}:{$c0}:{$c1}") }, next())

  Lambdas.acceptGenericConsumer({ println("${next()}:{$it}:{$c0}:{$c1}:{$c2}") }, Local(next()))
  Lambdas.acceptGenericConsumer({ println("${next()}:{$it}:{$c0}:{$c1}:{$c2}") }, Local(next()))

  Lambdas.acceptGenericConsumer(
    { println("${next()}:{$it}:{$c0}:{$c1}:{$c2}:{$c3}") },
    Local(Local(next())),
  )
  Lambdas.acceptGenericConsumer(
    { println("${next()}:{$it}:{$c0}:{$c1}:{$c2}:{$c3}") },
    Local(Local(next())),
  )
}

private fun test2(c0: String, c1: String, c2: String) {
  println(Lambdas.acceptIntSupplier { nextInt() })
  println(Lambdas.acceptIntSupplier { nextInt() })

  println(Lambdas.acceptStringSupplier { "${next()}:$c0" })
  println(Lambdas.acceptStringSupplier { "${next()}:$c0" })

  println(Lambdas.acceptGenericSupplier { "${next()}:$c0" })
  println(Lambdas.acceptGenericSupplier { "${next()}:$c0" })

  println(Lambdas.acceptGenericSupplier { "${Local(next())}:$c0:$c1" })
  println(Lambdas.acceptGenericSupplier { "${Local(next())}:$c0:$c1" })

  println(Lambdas.acceptGenericSupplier { "${Local(Local(next()))}:$c0:$c1:$c2" })
  println(Lambdas.acceptGenericSupplier { "${Local(Local(next()))}:$c0:$c1:$c2" })
}

private fun <P1, P2, P3> test3a(a: P1, b: P2, c: P3) {
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, a, b, c)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, c, a, b)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, b, c, a)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, Local(a), b, c)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, Local(b), a, c)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, a, Local(b), c)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, a, Local(c), b)
  Lambdas.acceptMultiFunction(
    { x, y, z -> "$x:$y:$z" },
    Local(Local(a)),
    Local(Local(b)),
    Local(Local(c)),
  )
  Lambdas.acceptMultiFunction(
    { x, y, z -> "$x:$y:$z" },
    Local(Local(c)),
    Local(Local(a)),
    Local(Local(b)),
  )
}

private fun <P> test3b(a: P, b: P, c: P) {
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, a, b, c)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, c, a, b)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, b, c, a)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, Local(a), b, c)
  Lambdas.acceptMultiFunction({ x, y, z -> "$x:$y:$z" }, Local(b), a, c)
}
