From 9ae099ec2349321e49d729ec9085a6441bc2132b Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 3 Aug 2023 19:41:58 +0700 Subject: [PATCH] Add mutating operations to streamy iterators --- .../entity/tech/PlatePressBlockEntity.kt | 8 ++- .../mc/otm/core/collect/StreamyIterator.kt | 55 +++++++++++++++---- 2 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt index f7583bede..484df1610 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/tech/PlatePressBlockEntity.kt @@ -20,6 +20,8 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.UpgradeContainer import ru.dbotthepony.mc.otm.container.balance +import ru.dbotthepony.mc.otm.core.collect.filter +import ru.dbotthepony.mc.otm.core.collect.findAny import ru.dbotthepony.mc.otm.menu.tech.PlatePressMenu import ru.dbotthepony.mc.otm.menu.tech.TwinPlatePressMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities @@ -88,10 +90,10 @@ class PlatePressBlockEntity( val recipe = level.recipeManager .byType(MRecipes.PLATE_PRESS) .values - .stream() + .iterator() .filter { it.matches(inputContainer, id) } - .findAny(). - orElse(null) ?: return JobContainer.noItem() + .findAny() + .orElse(null) ?: return JobContainer.noItem() val toProcess = inputContainer[id].count.coerceAtMost(1 + upgrades.processingItems) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/StreamyIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/StreamyIterator.kt index 53cda603a..ad729b6d7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/StreamyIterator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/collect/StreamyIterator.kt @@ -14,7 +14,7 @@ import java.util.stream.Collector // Aside parallel work, unimplemented Stream API elements can be easily implemented when required -class FilteredIterator(private val parent: Iterator, private val predicate: Predicate) : Iterator { +class FilteredIterator(private val parent: Iterator, private val predicate: Predicate) : MutableIterator { private var foundValue: Any? = Companion override fun hasNext(): Boolean { @@ -54,10 +54,19 @@ class FilteredIterator(private val parent: Iterator, private val predicate return foundValue as T } + override fun remove() { + if (foundValue === Companion) { + throw NoSuchElementException() + } + + (parent as MutableIterator).remove() + foundValue = Companion + } + private companion object } -class MappingIterator(private val parent: Iterator, private val transform: (T) -> R) : Iterator { +class MappingIterator(private val parent: Iterator, private val transform: (T) -> R) : MutableIterator { override fun hasNext(): Boolean { return parent.hasNext() } @@ -65,10 +74,15 @@ class MappingIterator(private val parent: Iterator, private val transfo override fun next(): R { return transform.invoke(parent.next()) } + + override fun remove() { + (parent as MutableIterator).remove() + } } -class FlatMappingIterator(private val parent: Iterator, private val transform: (T) -> Iterator) : Iterator { +class FlatMappingIterator(private val parent: Iterator, private val transform: (T) -> Iterator) : MutableIterator { private var current: Iterator? = null + private var last: Iterator? = null override fun hasNext(): Boolean { while (current?.hasNext() != true && parent.hasNext()) { @@ -82,7 +96,14 @@ class FlatMappingIterator(private val parent: Iterator, private val tra if (!hasNext()) throw NoSuchElementException() - return current!!.next() + val v = current!!.next() + last = current + return v + } + + override fun remove() { + (last as MutableIterator? ?: throw NoSuchElementException()).remove() + last = null } } @@ -105,12 +126,13 @@ class LimitingIterator(val parent: Iterator, val limit: Long) : Iterator(val parent: Iterator, skip: Long) : Iterator { +class SkippingIterator(val parent: Iterator, skip: Long) : MutableIterator { init { require(skip >= 0) { "Invalid skip amount $skip" } } private var found = skip + private var returned = false override fun hasNext(): Boolean { while (parent.hasNext() && found > 0L) { @@ -125,15 +147,26 @@ class SkippingIterator(val parent: Iterator, skip: Long) : Iterator { if (!hasNext()) throw NoSuchElementException() - return parent.next() + val v = parent.next() + returned = true + return v + } + + override fun remove() { + if (!returned) { + throw NoSuchElementException() + } + + returned = false + (parent as MutableIterator).remove() } } -fun Iterator.filter(condition: Predicate): Iterator = FilteredIterator(this, condition) -fun Iterator.map(mapper: (T) -> R): Iterator = MappingIterator(this, mapper) -fun Iterator.map(mapper: java.util.function.Function): Iterator = MappingIterator(this, mapper::apply) -fun Iterator.flatMap(mapper: (T) -> Iterator): Iterator = FlatMappingIterator(this, mapper) -fun Iterator.flatMap(mapper: java.util.function.Function>): Iterator = FlatMappingIterator(this, mapper::apply) +fun Iterator.filter(condition: Predicate) = FilteredIterator(this, condition) +fun Iterator.map(mapper: (T) -> R) = MappingIterator(this, mapper) +fun Iterator.map(mapper: java.util.function.Function) = MappingIterator(this, mapper::apply) +fun Iterator.flatMap(mapper: (T) -> Iterator) = FlatMappingIterator(this, mapper) +fun Iterator.flatMap(mapper: java.util.function.Function>) = FlatMappingIterator(this, mapper::apply) fun interface O2DFunction { fun apply(value: T): Double