More streamlined iterators

This commit is contained in:
DBotThePony 2022-09-02 00:15:04 +07:00
parent e6b8b9b409
commit 70dac3ba93
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -3,8 +3,8 @@ package ru.dbotthepony.mc.otm.container
import net.minecraft.world.Container import net.minecraft.world.Container
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.Capability
import net.minecraftforge.common.capabilities.ICapabilityProvider
import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.core.ifPresentK
import java.util.function.Consumer
class ContainerIterator(private val container: Container) : MutableIterator<ItemStack> { class ContainerIterator(private val container: Container) : MutableIterator<ItemStack> {
private var index = 0 private var index = 0
@ -30,10 +30,7 @@ class ContainerIterator(private val container: Container) : MutableIterator<Item
} }
} }
fun Container.iterator() = ContainerIterator(this) open class NonEmptyItemStackIterator(protected open val parent: Iterator<ItemStack>) : Iterator<ItemStack> {
class NonEmptyContainerIterator(container: Container) : MutableIterator<ItemStack> {
private val parent = ContainerIterator(container)
private var itemStack: ItemStack? = null private var itemStack: ItemStack? = null
private var searched = false private var searched = false
@ -70,30 +67,29 @@ class NonEmptyContainerIterator(container: Container) : MutableIterator<ItemStac
this.searched = false this.searched = false
return itemStack return itemStack
} }
}
class NonEmptyMutableItemStackIterator(override val parent: MutableIterator<ItemStack>) : NonEmptyItemStackIterator(parent), MutableIterator<ItemStack> {
override fun remove() { override fun remove() {
parent.remove() parent.remove()
} }
} }
fun Container.nonEmptyIterator() = NonEmptyContainerIterator(this) open class CapabilityIterator<P : ICapabilityProvider, T>(protected open val parent: Iterator<P>, private val cap: Capability<T>) : Iterator<Pair<P, T>> {
private var provider: P? = null
class ContainerIteratorCapability<T>(container: Container, private val cap: Capability<T>) : MutableIterator<Pair<ItemStack, T>> {
private val parent = NonEmptyContainerIterator(container)
private var itemStack: ItemStack? = null
private var capability: T? = null private var capability: T? = null
private var searched = false private var searched = false
private fun search() { private fun search() {
searched = true searched = true
if (itemStack != null) { if (provider != null) {
return return
} }
for (item in parent) { for (provider in parent) {
item.getCapability(cap).ifPresentK { provider.getCapability(cap).ifPresentK {
itemStack = item this.provider = provider
capability = it capability = it
return return
} }
@ -105,28 +101,38 @@ class ContainerIteratorCapability<T>(container: Container, private val cap: Capa
search() search()
} }
return itemStack != null return provider != null
} }
override fun next(): Pair<ItemStack, T> { override fun next(): Pair<P, T> {
if (!searched) { if (!searched) {
search() 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") val capability = capability ?: throw IllegalStateException("No next element")
this.itemStack = null this.provider = null
this.capability = null this.capability = null
this.searched = false this.searched = false
return itemStack to capability return provider to capability
} }
}
class MutableCapabilityIterator<P : ICapabilityProvider, T>(override val parent: MutableIterator<P>, cap: Capability<T>) : CapabilityIterator<P, T>(parent, cap), MutableIterator<Pair<P, T>> {
override fun remove() { override fun remove() {
parent.remove() parent.remove()
} }
} }
fun <T> Container.iterator(cap: Capability<T>) = ContainerIteratorCapability(this, cap) fun Container.iterator() = ContainerIterator(this)
fun Iterator<ItemStack>.nonEmpty() = NonEmptyItemStackIterator(this)
fun MutableIterator<ItemStack>.nonEmpty() = NonEmptyMutableItemStackIterator(this)
fun Container.nonEmptyIterator() = iterator().nonEmpty()
fun <T> Container.iterator(cap: Capability<T>) = CapabilityIterator(nonEmptyIterator(), cap)
fun <P : ICapabilityProvider, T> Iterator<P>.filtered(cap: Capability<T>) = CapabilityIterator(this, cap)
fun <P : ICapabilityProvider, T> MutableIterator<P>.filtered(cap: Capability<T>) = MutableCapabilityIterator(this, cap)
inline fun <T> Container.forEach(cap: Capability<T>, consumer: (Pair<ItemStack, T>) -> Unit) { inline fun <T> Container.forEach(cap: Capability<T>, consumer: (Pair<ItemStack, T>) -> Unit) {
for (value in iterator(cap)) { for (value in iterator(cap)) {