| // This file is compiled into each stepping test only if the WITH_STDLIB directive is NOT specified. |
| |
| package testUtils |
| |
| import kotlin.reflect.KClass |
| |
| inline fun <T, S> Array<T>.map(noinline transform: (T) -> S): Array<S> = asDynamic().map(transform).unsafeCast<Array<S>>() |
| |
| inline fun <T> Array<T>.some(noinline predicate: (T) -> Boolean): Boolean = asDynamic().some(predicate).unsafeCast<Boolean>() |
| |
| internal data class Pair<A, B>(val first: A, val second: B) |
| |
| internal infix fun <A, B> A.to(that: B) = Pair(this, that) |
| |
| /** |
| * A simple polyfill. We don't need fancy hashsets, since we don't deal with many values in the helpers. |
| */ |
| private class ArraySet<T>(private val array: Array<T>) : Set<T> { |
| override val size: Int |
| get() = array.size |
| |
| override fun contains(element: T) = array.some { it == element } |
| |
| override fun containsAll(elements: Collection<T>): Boolean { |
| for (element in elements) { |
| if (!contains(element)) return false |
| } |
| return true |
| } |
| |
| override fun isEmpty() = size == 0 |
| |
| override fun iterator(): Iterator<T> = array.iterator() |
| } |
| |
| /** |
| * A simple polyfill. We don't need fancy hashmaps, since we don't deal with many values in the helpers. |
| */ |
| private class ArrayMap<Key, Value>(private val array: Array<Pair<Key, Value>>): Map<Key, Value> { |
| |
| private class Entry<Key, Value>(override val key: Key, override val value: Value) : Map.Entry<Key, Value> |
| |
| override val entries: Set<Map.Entry<Key, Value>> |
| get() = ArraySet(array.map { Entry(it.first, it.second) }) |
| |
| override val keys: Set<Key> |
| get() = ArraySet(array.map { it.first }) |
| |
| override val values: Collection<Value> |
| get() = ArraySet(array.map { it.second }) |
| |
| override val size: Int |
| get() = array.size |
| |
| override fun containsKey(key: Key) = array.some { it.first == key } |
| |
| override fun containsValue(value: Value) = array.some { it.second == value } |
| |
| override fun get(key: Key): Value? { |
| for ((first, second) in array) { |
| if (first == key) return second |
| } |
| return null |
| } |
| |
| override fun isEmpty() = size == 0 |
| |
| fun put(key: Key, value: Value): Value? { |
| for (i in 0 until size) { |
| val entry = array[i] |
| if (entry.first == key) { |
| array[i] = key to value |
| return entry.second |
| } |
| } |
| array.asDynamic().push(key to value) |
| return null |
| } |
| } |
| |
| internal fun <Key, Value> mapOf(vararg pairs: Pair<Key, Value>): Map<Key, Value> = ArrayMap(arrayOf(*pairs)) |
| |
| internal operator fun <K, V> Map<out K, V>.plus(map: Map<out K, V>): Map<K, V> { |
| val newMap = ArrayMap<K, V>(arrayOf()) |
| for (entry in this.entries) { |
| newMap.put(entry.key, entry.value) |
| } |
| for (entry in map.entries) { |
| newMap.put(entry.key, entry.value) |
| } |
| return newMap |
| } |
| |
| internal val stdlibFqNames = mapOf<KClass<*>, String>() |