Relocate some classes, and add filtering methods to the handler itself

This commit is contained in:
shedaniel
2022-02-05 20:01:10 +08:00
parent 6da7fd9e4f
commit 52aa329597
15 changed files with 133 additions and 59 deletions

View File

@@ -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<T> extends TransferView<T>, Closeable {
@Override
void close();
default ResourceView<T> unmodifiable() {
return filter(Predicates.alwaysFalse());
}
default ResourceView<T> filter(Predicate<T> filter) {
return FilteringResourceView.of(this, filter);
}
}

View File

@@ -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<T> extends TransferView<T> {
@Deprecated
ResourceView<T> getContent(int index);
default void withContent(int index, Consumer<ResourceView<T>> consumer) {
try (ResourceView<T> 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<T> extends TransferView<T> {
* @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<T> 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<T> toExtract, long maxAmount, TransferAction action) {
try (ResourceView<T> 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<T> resource = getContent(index)) {
return resource.extract(maxAmount, action);
}
}
default TransferHandler<T> unmodifiable() {
return filter(Predicates.alwaysFalse());
}
default TransferHandler<T> onlyInsert() {
return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse());
}
default TransferHandler<T> onlyExtract() {
return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue());
}
default TransferHandler<T> filter(Predicate<T> filter) {
return filter(filter, filter);
}
default TransferHandler<T> filter(Predicate<T> insert, Predicate<T> extract) {
return FilteringTransferHandler.of(this, insert, extract);
}
}

View File

@@ -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.<br>

View File

@@ -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;
/**

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<T> extends CombinedTransferHandle
}
@Override
@Deprecated
default int getContentsSize() {
return getParts().size();
}
@Override
@Deprecated
default SingleTransferHandler<T> getContent(int index) {
return getParts().get(index);
}

View File

@@ -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<T> extends TransferHandler<T>, VariantV
if (index < 0) {
throw new IllegalArgumentException("Index must be non-negative");
}
int i = 0;
int i = index;
for (TransferHandler<T> 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");
}

View File

@@ -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<T> extends ForwardingResourceView<T>, ExtractableView<T> {
static <T> FilteringResourceView<T> unmodifiable(ResourceView<T> delegate) {
return FilteringResourceView.of(delegate, Predicates.alwaysFalse());
}
static <T> FilteringResourceView<T> of(ResourceView<T> delegate, Predicate<T> canExtract) {
return new FilteringResourceView<T>() {
@Override

View File

@@ -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<T> extends FilteringTransferHandler<T>, ForwardingSingleTransferHandler<T> {
static <T> FilteringSingleTransferHandler<T> unmodifiable(SingleTransferHandler<T> delegate) {
return FilteringSingleTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysFalse());
}
static <T> FilteringSingleTransferHandler<T> onlyInsert(SingleTransferHandler<T> delegate) {
return FilteringSingleTransferHandler.of(delegate, Predicates.alwaysTrue(), Predicates.alwaysFalse());
}
static <T> FilteringSingleTransferHandler<T> onlyExtract(SingleTransferHandler<T> delegate) {
return FilteringSingleTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysTrue());
}
static <T> FilteringSingleTransferHandler<T> predicate(SingleTransferHandler<T> delegate, Predicate<T> predicate) {
return FilteringSingleTransferHandler.of(delegate, predicate, predicate);
}
static <T> FilteringSingleTransferHandler<T> of(SingleTransferHandler<T> delegate, Predicate<T> canInsert, Predicate<T> canExtract) {
return new FilteringSingleTransferHandler<T>() {
@Override

View File

@@ -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<T> extends ForwardingTransferHandler<T>, ModifiableView<T> {
static <T> FilteringTransferHandler<T> unmodifiable(TransferHandler<T> delegate) {
return FilteringTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysFalse());
}
static <T> FilteringTransferHandler<T> onlyInsert(TransferHandler<T> delegate) {
return FilteringTransferHandler.of(delegate, Predicates.alwaysTrue(), Predicates.alwaysFalse());
}
static <T> FilteringTransferHandler<T> onlyExtract(TransferHandler<T> delegate) {
return FilteringTransferHandler.of(delegate, Predicates.alwaysFalse(), Predicates.alwaysTrue());
}
static <T> FilteringTransferHandler<T> predicate(TransferHandler<T> delegate, Predicate<T> predicate) {
return FilteringTransferHandler.of(delegate, predicate, predicate);
}
static <T> FilteringTransferHandler<T> of(TransferHandler<T> delegate, Predicate<T> canInsert, Predicate<T> canExtract) {
return new FilteringTransferHandler<T>() {
@Override

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<T> extends TransferHandler<T>, ResourceVi
default long getAmount() {
return getAmount(getResource());
}
@Override
default SingleTransferHandler<T> unmodifiable() {
return filter(Predicates.alwaysFalse());
}
@Override
default SingleTransferHandler<T> onlyInsert() {
return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse());
}
@Override
default SingleTransferHandler<T> onlyExtract() {
return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue());
}
@Override
default SingleTransferHandler<T> filter(Predicate<T> filter) {
return filter(filter, filter);
}
@Override
default SingleTransferHandler<T> filter(Predicate<T> insert, Predicate<T> extract) {
return FilteringSingleTransferHandler.of(this, insert, extract);
}
}