diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/util/MiscExtensions.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/util/MiscExtensions.kt | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/util/MiscExtensions.kt b/src/main/kotlin/io/dico/parcels2/util/MiscExtensions.kt index 952595b..7a2504d 100644 --- a/src/main/kotlin/io/dico/parcels2/util/MiscExtensions.kt +++ b/src/main/kotlin/io/dico/parcels2/util/MiscExtensions.kt @@ -12,6 +12,51 @@ fun File.tryCreate(): Boolean { return true } -inline fun <R> Any.synchronized(block: () -> R): R { - return synchronized(this, block) +inline fun <R> Any.synchronized(block: () -> R): R = synchronized(this, block) + +inline fun <T> T?.isNullOr(condition: T.() -> Boolean): Boolean = this == null || condition() +inline fun <T> T?.isPresentAnd(condition: T.() -> Boolean): Boolean = this != null && condition() + +inline fun <T, U> MutableMap<T, U>.editLoop(block: EditLoopScope<T, U>.(T, U) -> Unit) { + return EditLoopScope(this).doEditLoop(block) +} + +inline fun <T, U> MutableMap<T, U>.editLoop(block: EditLoopScope<T, U>.() -> Unit) { + return EditLoopScope(this).doEditLoop(block) +} + +class EditLoopScope<T, U>(val _map: MutableMap<T, U>) { + private var iterator: MutableIterator<MutableMap.MutableEntry<T, U>>? = null + lateinit var _entry: MutableMap.MutableEntry<T, U> + + inline val key get() = _entry.key + inline var value + get() = _entry.value + set(target) = run { _entry.setValue(target) } + + inline fun doEditLoop(block: EditLoopScope<T, U>.() -> Unit) { + val it = _initIterator() + while (it.hasNext()) { + _entry = it.next() + block() + } + } + + inline fun doEditLoop(block: EditLoopScope<T, U>.(T, U) -> Unit) { + val it = _initIterator() + while (it.hasNext()) { + val entry = it.next().also { _entry = it } + block(entry.key, entry.value) + } + } + + fun remove() { + iterator!!.remove() + } + + fun _initIterator(): MutableIterator<MutableMap.MutableEntry<T, U>> { + iterator?.let { throw IllegalStateException() } + return _map.entries.iterator().also { iterator = it } + } + } |