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

private var COUNT = 0

fun nextInt() = COUNT++

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

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

private fun test() {
  test2(listOf(next(), next(), next(), next(), next(), next(), next(), next(), next(), next()))
}

private fun Collection<String>.flatten() =
  this.joinToString(prefix = "(*", postfix = "*)", separator = "*")

private fun Array<String>.flatten() =
  this.joinToString(prefix = "(*", postfix = "*)", separator = "*")

private fun test2(args: Collection<String>) {
  println(args.sortedByDescending { it.length }.flatten())
  println(args.sortedByDescending { -it.length }.flatten())
  process(::println)
  process(::println)
  val lambda: (Array<String>) -> Unit = {}
}

private inline fun process(crossinline f: (String) -> Unit) {
  feed2 { f(it.flatten()) }
  feed3 { f(it.flatten()) }
}

private fun feed3(f: (Array<String>) -> Unit) {
  f(arrayOf(next(), next(), next()))
}

private fun feed2(f: (Array<String>) -> Unit) {
  f(arrayOf(next(), next()))
}
