diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt index 815fc66b7..465be0375 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt @@ -3,8 +3,8 @@ package ru.dbotthepony.mc.otm.container import net.minecraft.world.Container import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.core.ifPresentK -import java.util.function.Consumer class ContainerIterator(private val container: Container) : MutableIterator { private var index = 0 @@ -30,10 +30,7 @@ class ContainerIterator(private val container: Container) : MutableIterator { - private val parent = ContainerIterator(container) +open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { private var itemStack: ItemStack? = null private var searched = false @@ -70,30 +67,29 @@ class NonEmptyContainerIterator(container: Container) : MutableIterator) : NonEmptyItemStackIterator(parent), MutableIterator { override fun remove() { parent.remove() } } -fun Container.nonEmptyIterator() = NonEmptyContainerIterator(this) - -class ContainerIteratorCapability(container: Container, private val cap: Capability) : MutableIterator> { - private val parent = NonEmptyContainerIterator(container) - private var itemStack: ItemStack? = null +open class CapabilityIterator

(protected open val parent: Iterator

, private val cap: Capability) : Iterator> { + private var provider: P? = null private var capability: T? = null private var searched = false private fun search() { searched = true - if (itemStack != null) { + if (provider != null) { return } - for (item in parent) { - item.getCapability(cap).ifPresentK { - itemStack = item + for (provider in parent) { + provider.getCapability(cap).ifPresentK { + this.provider = provider capability = it return } @@ -105,28 +101,38 @@ class ContainerIteratorCapability(container: Container, private val cap: Capa search() } - return itemStack != null + return provider != null } - override fun next(): Pair { + override fun next(): Pair { if (!searched) { search() } - val itemStack = itemStack ?: throw IllegalStateException("No next element") + val provider = provider ?: throw IllegalStateException("No next element") val capability = capability ?: throw IllegalStateException("No next element") - this.itemStack = null + this.provider = null this.capability = null this.searched = false - return itemStack to capability + return provider to capability } +} +class MutableCapabilityIterator

(override val parent: MutableIterator

, cap: Capability) : CapabilityIterator(parent, cap), MutableIterator> { override fun remove() { parent.remove() } } -fun Container.iterator(cap: Capability) = ContainerIteratorCapability(this, cap) +fun Container.iterator() = ContainerIterator(this) +fun Iterator.nonEmpty() = NonEmptyItemStackIterator(this) +fun MutableIterator.nonEmpty() = NonEmptyMutableItemStackIterator(this) +fun Container.nonEmptyIterator() = iterator().nonEmpty() + +fun Container.iterator(cap: Capability) = CapabilityIterator(nonEmptyIterator(), cap) + +fun

Iterator

.filtered(cap: Capability) = CapabilityIterator(this, cap) +fun

MutableIterator

.filtered(cap: Capability) = MutableCapabilityIterator(this, cap) inline fun Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { for (value in iterator(cap)) {