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