diff --git a/common/src/main/java/dev/architectury/transfer/ResourceView.java b/common/src/main/java/dev/architectury/transfer/ResourceView.java index 02beb890..ae2396cc 100644 --- a/common/src/main/java/dev/architectury/transfer/ResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/ResourceView.java @@ -19,6 +19,9 @@ package dev.architectury.transfer; +import com.google.common.base.Predicates; +import dev.architectury.transfer.wrapper.filtering.FilteringResourceView; + import java.io.Closeable; import java.util.function.Predicate; @@ -59,4 +62,12 @@ public interface ResourceView extends TransferView, Closeable { @Override void close(); + + default ResourceView unmodifiable() { + return filter(Predicates.alwaysFalse()); + } + + default ResourceView filter(Predicate filter) { + return FilteringResourceView.of(this, filter); + } } diff --git a/common/src/main/java/dev/architectury/transfer/TransferHandler.java b/common/src/main/java/dev/architectury/transfer/TransferHandler.java index 1b0749b6..c20c1d5f 100644 --- a/common/src/main/java/dev/architectury/transfer/TransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/TransferHandler.java @@ -19,11 +19,14 @@ package dev.architectury.transfer; +import com.google.common.base.Predicates; import dev.architectury.fluid.FluidStack; +import dev.architectury.transfer.wrapper.filtering.FilteringTransferHandler; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.stream.Stream; /** @@ -97,6 +100,12 @@ public interface TransferHandler extends TransferView { @Deprecated ResourceView getContent(int index); + default void withContent(int index, Consumer> consumer) { + try (ResourceView resource = getContent(index)) { + consumer.accept(resource); + } + } + /** * Inserts the given resource into the handler, returning the amount that was inserted. * @@ -105,4 +114,67 @@ public interface TransferHandler extends TransferView { * @return the amount that was inserted */ long insert(T toInsert, TransferAction action); + + /** + * Extracts the given resource from a given resource index, returning the stack that was extracted. + * + * @param index the index of the resource + * @param toExtract the resource to extract + * @param action whether to simulate or actually extract the resource + * @return the stack that was extracted + */ + default T extract(int index, T toExtract, TransferAction action) { + try (ResourceView resource = getContent(index)) { + return resource.extract(toExtract, action); + } + } + + /** + * Extracts the given resource from a given resource index, returning the stack that was extracted. + * + * @param index the index of the resource + * @param toExtract the predicates to use to filter the resources to extract + * @param maxAmount the maximum amount of resources to extract + * @param action whether to simulate or actually extract the resource + * @return the stack that was extracted + */ + default T extract(int index, Predicate toExtract, long maxAmount, TransferAction action) { + try (ResourceView resource = getContent(index)) { + return resource.extract(toExtract, maxAmount, action); + } + } + + /** + * Extracts the any resource from a given resource index, returning the stack that was extracted. + * + * @param index the index of the resource + * @param maxAmount the maximum amount of resources to extract + * @param action whether to simulate or actually extract the resource + * @return the stack that was extracted + */ + default T extract(int index, long maxAmount, TransferAction action) { + try (ResourceView resource = getContent(index)) { + return resource.extract(maxAmount, action); + } + } + + default TransferHandler unmodifiable() { + return filter(Predicates.alwaysFalse()); + } + + default TransferHandler onlyInsert() { + return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse()); + } + + default TransferHandler onlyExtract() { + return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue()); + } + + default TransferHandler filter(Predicate filter) { + return filter(filter, filter); + } + + default TransferHandler filter(Predicate insert, Predicate extract) { + return FilteringTransferHandler.of(this, insert, extract); + } } diff --git a/common/src/main/java/dev/architectury/transfer/fluid/wrapper/CombinedFluidTransferHandler.java b/common/src/main/java/dev/architectury/transfer/fluid/wrapper/CombinedFluidTransferHandler.java index e1cc8e12..695aded8 100644 --- a/common/src/main/java/dev/architectury/transfer/fluid/wrapper/CombinedFluidTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/fluid/wrapper/CombinedFluidTransferHandler.java @@ -22,7 +22,7 @@ package dev.architectury.transfer.fluid.wrapper; import dev.architectury.fluid.FluidStack; import dev.architectury.transfer.TransferHandler; import dev.architectury.transfer.fluid.FluidTransferHandler; -import dev.architectury.transfer.wrapper.CombinedTransferHandler; +import dev.architectury.transfer.wrapper.combined.CombinedTransferHandler; /** * A {@link TransferHandler} that combines multiple {@link TransferHandler}s.
diff --git a/common/src/main/java/dev/architectury/transfer/item/wrapper/CombinedItemTransferHandler.java b/common/src/main/java/dev/architectury/transfer/item/wrapper/CombinedItemTransferHandler.java index e5112038..fae6eb77 100644 --- a/common/src/main/java/dev/architectury/transfer/item/wrapper/CombinedItemTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/item/wrapper/CombinedItemTransferHandler.java @@ -21,7 +21,7 @@ package dev.architectury.transfer.item.wrapper; import dev.architectury.transfer.TransferHandler; import dev.architectury.transfer.item.ItemTransferHandler; -import dev.architectury.transfer.wrapper.CombinedTransferHandler; +import dev.architectury.transfer.wrapper.combined.CombinedTransferHandler; import net.minecraft.world.item.ItemStack; /** diff --git a/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java b/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java index 42944670..f4200246 100644 --- a/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/item/wrapper/ContainerTransferHandler.java @@ -20,7 +20,7 @@ package dev.architectury.transfer.item.wrapper; import dev.architectury.transfer.item.ItemTransferHandler; -import dev.architectury.transfer.wrapper.CombinedSingleTransferHandler; +import dev.architectury.transfer.wrapper.combined.CombinedSingleTransferHandler; import dev.architectury.transfer.wrapper.single.BaseSingleTransferHandler; import dev.architectury.transfer.wrapper.single.SingleTransferHandler; import net.minecraft.world.Container; diff --git a/common/src/main/java/dev/architectury/transfer/item/wrapper/WorldlyContainerTransferHandler.java b/common/src/main/java/dev/architectury/transfer/item/wrapper/WorldlyContainerTransferHandler.java index e18590ec..9f6dabe9 100644 --- a/common/src/main/java/dev/architectury/transfer/item/wrapper/WorldlyContainerTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/item/wrapper/WorldlyContainerTransferHandler.java @@ -19,7 +19,7 @@ package dev.architectury.transfer.item.wrapper; -import dev.architectury.transfer.wrapper.single.FilteringSingleTransferHandler; +import dev.architectury.transfer.wrapper.filtering.FilteringSingleTransferHandler; import dev.architectury.transfer.wrapper.single.SingleTransferHandler; import net.minecraft.core.Direction; import net.minecraft.world.WorldlyContainer; diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/CombinedSingleTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/combined/CombinedSingleTransferHandler.java similarity index 96% rename from common/src/main/java/dev/architectury/transfer/wrapper/CombinedSingleTransferHandler.java rename to common/src/main/java/dev/architectury/transfer/wrapper/combined/CombinedSingleTransferHandler.java index 95dc8dec..615ae31d 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/CombinedSingleTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/combined/CombinedSingleTransferHandler.java @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper; +package dev.architectury.transfer.wrapper.combined; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferHandler; @@ -53,13 +53,11 @@ public interface CombinedSingleTransferHandler extends CombinedTransferHandle } @Override - @Deprecated default int getContentsSize() { return getParts().size(); } @Override - @Deprecated default SingleTransferHandler getContent(int index) { return getParts().get(index); } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/CombinedTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/combined/CombinedTransferHandler.java similarity index 95% rename from common/src/main/java/dev/architectury/transfer/wrapper/CombinedTransferHandler.java rename to common/src/main/java/dev/architectury/transfer/wrapper/combined/CombinedTransferHandler.java index 239e9adf..45798a56 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/CombinedTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/combined/CombinedTransferHandler.java @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper; +package dev.architectury.transfer.wrapper.combined; import com.google.common.collect.Streams; import dev.architectury.transfer.ResourceView; @@ -58,12 +58,13 @@ public interface CombinedTransferHandler extends TransferHandler, VariantV if (index < 0) { throw new IllegalArgumentException("Index must be non-negative"); } - int i = 0; + int i = index; for (TransferHandler handler : getHandlers()) { - if (i == index) { - return handler.getContent(0); + int contentsSize = handler.getContentsSize(); + if (i < contentsSize) { + return handler.getContent(i); } - i += handler.getContentsSize(); + i -= contentsSize; } throw new IndexOutOfBoundsException("Index " + index + " is out of bounds"); } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java similarity index 88% rename from common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java rename to common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java index fe7413a4..cf10fc81 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/FilteringResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java @@ -17,20 +17,16 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper; +package dev.architectury.transfer.wrapper.filtering; -import com.google.common.base.Predicates; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferAction; import dev.architectury.transfer.view.ExtractableView; +import dev.architectury.transfer.wrapper.forwarding.ForwardingResourceView; import java.util.function.Predicate; public interface FilteringResourceView extends ForwardingResourceView, ExtractableView { - static FilteringResourceView unmodifiable(ResourceView delegate) { - return FilteringResourceView.of(delegate, Predicates.alwaysFalse()); - } - static FilteringResourceView of(ResourceView delegate, Predicate canExtract) { return new FilteringResourceView() { @Override diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/single/FilteringSingleTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java similarity index 64% rename from common/src/main/java/dev/architectury/transfer/wrapper/single/FilteringSingleTransferHandler.java rename to common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java index 4fbe4523..871d1207 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/single/FilteringSingleTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java @@ -17,31 +17,15 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper.single; +package dev.architectury.transfer.wrapper.filtering; -import com.google.common.base.Predicates; import dev.architectury.transfer.TransferAction; -import dev.architectury.transfer.wrapper.FilteringTransferHandler; +import dev.architectury.transfer.wrapper.forwarding.ForwardingSingleTransferHandler; +import dev.architectury.transfer.wrapper.single.SingleTransferHandler; import java.util.function.Predicate; public interface FilteringSingleTransferHandler extends FilteringTransferHandler, ForwardingSingleTransferHandler { - static FilteringSingleTransferHandler unmodifiable(SingleTransferHandler delegate) { - return FilteringSingleTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysFalse()); - } - - static FilteringSingleTransferHandler onlyInsert(SingleTransferHandler delegate) { - return FilteringSingleTransferHandler.of(delegate, Predicates.alwaysTrue(), Predicates.alwaysFalse()); - } - - static FilteringSingleTransferHandler onlyExtract(SingleTransferHandler delegate) { - return FilteringSingleTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysTrue()); - } - - static FilteringSingleTransferHandler predicate(SingleTransferHandler delegate, Predicate predicate) { - return FilteringSingleTransferHandler.of(delegate, predicate, predicate); - } - static FilteringSingleTransferHandler of(SingleTransferHandler delegate, Predicate canInsert, Predicate canExtract) { return new FilteringSingleTransferHandler() { @Override diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/FilteringTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java similarity index 75% rename from common/src/main/java/dev/architectury/transfer/wrapper/FilteringTransferHandler.java rename to common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java index 55e0a454..bf400a01 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/FilteringTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java @@ -17,33 +17,17 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper; +package dev.architectury.transfer.wrapper.filtering; -import com.google.common.base.Predicates; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferAction; import dev.architectury.transfer.TransferHandler; import dev.architectury.transfer.view.ModifiableView; +import dev.architectury.transfer.wrapper.forwarding.ForwardingTransferHandler; import java.util.function.Predicate; public interface FilteringTransferHandler extends ForwardingTransferHandler, ModifiableView { - static FilteringTransferHandler unmodifiable(TransferHandler delegate) { - return FilteringTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysFalse()); - } - - static FilteringTransferHandler onlyInsert(TransferHandler delegate) { - return FilteringTransferHandler.of(delegate, Predicates.alwaysTrue(), Predicates.alwaysFalse()); - } - - static FilteringTransferHandler onlyExtract(TransferHandler delegate) { - return FilteringTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysTrue()); - } - - static FilteringTransferHandler predicate(TransferHandler delegate, Predicate predicate) { - return FilteringTransferHandler.of(delegate, predicate, predicate); - } - static FilteringTransferHandler of(TransferHandler delegate, Predicate canInsert, Predicate canExtract) { return new FilteringTransferHandler() { @Override diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/ForwardingResourceView.java b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java similarity index 97% rename from common/src/main/java/dev/architectury/transfer/wrapper/ForwardingResourceView.java rename to common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java index b4b95dde..49aa5036 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/ForwardingResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper; +package dev.architectury.transfer.wrapper.forwarding; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferAction; diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/single/ForwardingSingleTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingSingleTransferHandler.java similarity index 94% rename from common/src/main/java/dev/architectury/transfer/wrapper/single/ForwardingSingleTransferHandler.java rename to common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingSingleTransferHandler.java index eef7c94c..93ac7fbf 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/single/ForwardingSingleTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingSingleTransferHandler.java @@ -17,11 +17,11 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper.single; +package dev.architectury.transfer.wrapper.forwarding; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferAction; -import dev.architectury.transfer.wrapper.ForwardingTransferHandler; +import dev.architectury.transfer.wrapper.single.SingleTransferHandler; import java.util.function.Predicate; import java.util.stream.Stream; diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/ForwardingTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java similarity index 97% rename from common/src/main/java/dev/architectury/transfer/wrapper/ForwardingTransferHandler.java rename to common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java index 54cd2590..ce882ac1 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/ForwardingTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.transfer.wrapper; +package dev.architectury.transfer.wrapper.forwarding; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferAction; diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/single/SingleTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/single/SingleTransferHandler.java index 1bd939db..f6ded707 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/single/SingleTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/single/SingleTransferHandler.java @@ -19,11 +19,14 @@ package dev.architectury.transfer.wrapper.single; +import com.google.common.base.Predicates; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferHandler; import dev.architectury.transfer.view.ModifiableView; import dev.architectury.transfer.view.VariantView; +import dev.architectury.transfer.wrapper.filtering.FilteringSingleTransferHandler; +import java.util.function.Predicate; import java.util.stream.Stream; /** @@ -53,4 +56,29 @@ public interface SingleTransferHandler extends TransferHandler, ResourceVi default long getAmount() { return getAmount(getResource()); } + + @Override + default SingleTransferHandler unmodifiable() { + return filter(Predicates.alwaysFalse()); + } + + @Override + default SingleTransferHandler onlyInsert() { + return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse()); + } + + @Override + default SingleTransferHandler onlyExtract() { + return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue()); + } + + @Override + default SingleTransferHandler filter(Predicate filter) { + return filter(filter, filter); + } + + @Override + default SingleTransferHandler filter(Predicate insert, Predicate extract) { + return FilteringSingleTransferHandler.of(this, insert, extract); + } }