diff --git a/common/src/main/java/dev/architectury/transfer/ResourceView.java b/common/src/main/java/dev/architectury/transfer/ResourceView.java index ae2396cc..938a2866 100644 --- a/common/src/main/java/dev/architectury/transfer/ResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/ResourceView.java @@ -63,11 +63,28 @@ public interface ResourceView extends TransferView, Closeable { @Override void close(); + @Override default ResourceView unmodifiable() { return filter(Predicates.alwaysFalse()); } + @Override + default ResourceView onlyInsert() { + return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse()); + } + + @Override + default ResourceView onlyExtract() { + return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue()); + } + + @Override default ResourceView filter(Predicate filter) { - return FilteringResourceView.of(this, filter); + return filter(filter, filter); + } + + @Override + default ResourceView filter(Predicate insert, Predicate extract) { + return FilteringResourceView.of(this, insert, extract); } } diff --git a/common/src/main/java/dev/architectury/transfer/TransferHandler.java b/common/src/main/java/dev/architectury/transfer/TransferHandler.java index c20c1d5f..75db5a30 100644 --- a/common/src/main/java/dev/architectury/transfer/TransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/TransferHandler.java @@ -107,13 +107,18 @@ public interface TransferHandler extends TransferView { } /** - * Inserts the given resource into the handler, returning the amount that was inserted. + * Inserts the given resource into a given resource index, returning the amount that was inserted. * + * @param index the index of the resource * @param toInsert the resource to insert * @param action whether to simulate or actually insert the resource * @return the amount that was inserted */ - long insert(T toInsert, TransferAction action); + default long insert(int index, T toInsert, TransferAction action) { + try (ResourceView resource = getContent(index)) { + return resource.insert(toInsert, action); + } + } /** * Extracts the given resource from a given resource index, returning the stack that was extracted. @@ -158,22 +163,27 @@ public interface TransferHandler extends TransferView { } } + @Override default TransferHandler unmodifiable() { return filter(Predicates.alwaysFalse()); } + @Override default TransferHandler onlyInsert() { return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse()); } + @Override default TransferHandler onlyExtract() { return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue()); } + @Override default TransferHandler filter(Predicate filter) { return filter(filter, filter); } + @Override default TransferHandler filter(Predicate insert, Predicate extract) { return FilteringTransferHandler.of(this, insert, extract); } diff --git a/common/src/main/java/dev/architectury/transfer/TransferView.java b/common/src/main/java/dev/architectury/transfer/TransferView.java index f4622a3c..402317c0 100644 --- a/common/src/main/java/dev/architectury/transfer/TransferView.java +++ b/common/src/main/java/dev/architectury/transfer/TransferView.java @@ -20,11 +20,22 @@ package dev.architectury.transfer; import com.google.common.base.Predicates; +import dev.architectury.transfer.wrapper.filtering.FilteringTransferHandler; +import dev.architectury.transfer.wrapper.filtering.FilteringTransferView; import org.jetbrains.annotations.ApiStatus; import java.util.function.Predicate; public interface TransferView { + /** + * Inserts the given resource into the handler, returning the amount that was inserted. + * + * @param toInsert the resource to insert + * @param action whether to simulate or actually insert the resource + * @return the amount that was inserted + */ + long insert(T toInsert, TransferAction action); + /** * Extracts the given resource from the handler, returning the stack that was extracted. * @@ -93,4 +104,24 @@ public interface TransferView { */ @ApiStatus.OverrideOnly void loadState(Object state); + + default TransferView unmodifiable() { + return filter(Predicates.alwaysFalse()); + } + + default TransferView onlyInsert() { + return filter(Predicates.alwaysTrue(), Predicates.alwaysFalse()); + } + + default TransferView onlyExtract() { + return filter(Predicates.alwaysFalse(), Predicates.alwaysTrue()); + } + + default TransferView filter(Predicate filter) { + return filter(filter, filter); + } + + default TransferView filter(Predicate insert, Predicate extract) { + return FilteringTransferView.of(this, insert, extract); + } } diff --git a/common/src/main/java/dev/architectury/transfer/item/util/TransferHandlerSlot.java b/common/src/main/java/dev/architectury/transfer/item/util/TransferHandlerSlot.java index fb05fed7..c9ea9e42 100644 --- a/common/src/main/java/dev/architectury/transfer/item/util/TransferHandlerSlot.java +++ b/common/src/main/java/dev/architectury/transfer/item/util/TransferHandlerSlot.java @@ -1,3 +1,22 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + package dev.architectury.transfer.item.util; import dev.architectury.transfer.ResourceView; diff --git a/common/src/main/java/dev/architectury/transfer/view/ExtractableView.java b/common/src/main/java/dev/architectury/transfer/view/ExtractableView.java deleted file mode 100644 index 4097e74f..00000000 --- a/common/src/main/java/dev/architectury/transfer/view/ExtractableView.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * This file is part of architectury. - * Copyright (C) 2020, 2021, 2022 architectury - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -package dev.architectury.transfer.view; - -public interface ExtractableView { - default boolean canExtract(T toExtract) { - return true; - } -} diff --git a/common/src/main/java/dev/architectury/transfer/view/ModifiableView.java b/common/src/main/java/dev/architectury/transfer/view/ModifiableView.java index 197a292a..52a70498 100644 --- a/common/src/main/java/dev/architectury/transfer/view/ModifiableView.java +++ b/common/src/main/java/dev/architectury/transfer/view/ModifiableView.java @@ -19,8 +19,12 @@ package dev.architectury.transfer.view; -public interface ModifiableView extends ExtractableView { +public interface ModifiableView { default boolean canInsert(T toInsert) { return true; } + + default boolean canExtract(T toExtract) { + return true; + } } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java index cf10fc81..82b5a732 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringResourceView.java @@ -21,13 +21,12 @@ package dev.architectury.transfer.wrapper.filtering; 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 of(ResourceView delegate, Predicate canExtract) { +public interface FilteringResourceView extends ForwardingResourceView, FilteringTransferView { + static FilteringResourceView of(ResourceView delegate, Predicate canInsert, Predicate canExtract) { return new FilteringResourceView() { @Override public ResourceView forwardingTo() { @@ -35,26 +34,19 @@ public interface FilteringResourceView extends ForwardingResourceView, Ext } @Override - public boolean canExtract(T toExtract) { - return canExtract.test(toExtract); + public boolean canInsert(T toInsert) { + return canInsert.test(toInsert); } @Override - public void close() { - delegate.close(); + public boolean canExtract(T toExtract) { + return canExtract.test(toExtract); } }; } @Override - boolean canExtract(T toExtract); - - @Override - default T extract(T toExtract, TransferAction action) { - if (canExtract(toExtract)) { - return ForwardingResourceView.super.extract(toExtract, action); - } else { - return blank(); - } + default T extract(Predicate toExtract, long maxAmount, TransferAction action) { + return ForwardingResourceView.super.extract(toExtract, maxAmount, action); } } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java index 871d1207..54506f0d 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringSingleTransferHandler.java @@ -25,7 +25,7 @@ import dev.architectury.transfer.wrapper.single.SingleTransferHandler; import java.util.function.Predicate; -public interface FilteringSingleTransferHandler extends FilteringTransferHandler, ForwardingSingleTransferHandler { +public interface FilteringSingleTransferHandler extends ForwardingSingleTransferHandler, FilteringTransferHandler { static FilteringSingleTransferHandler of(SingleTransferHandler delegate, Predicate canInsert, Predicate canExtract) { return new FilteringSingleTransferHandler() { @Override diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java index bf400a01..96d325ec 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferHandler.java @@ -20,14 +20,12 @@ package dev.architectury.transfer.wrapper.filtering; 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 { +public interface FilteringTransferHandler extends ForwardingTransferHandler, FilteringTransferView { static FilteringTransferHandler of(TransferHandler delegate, Predicate canInsert, Predicate canExtract) { return new FilteringTransferHandler() { @Override @@ -47,31 +45,8 @@ public interface FilteringTransferHandler extends ForwardingTransferHandler toExtract, long maxAmount, TransferAction action) { - return ForwardingTransferHandler.super.extract(toExtract.and(this::canExtract), maxAmount, action); - } - @Override default ResourceView forwardResource(ResourceView resource) { - return FilteringResourceView.of(ForwardingTransferHandler.super.forwardResource(resource), this::canExtract); + return FilteringResourceView.of(ForwardingTransferHandler.super.forwardResource(resource), this::canInsert, this::canExtract); } } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferView.java b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferView.java new file mode 100644 index 00000000..21e571ab --- /dev/null +++ b/common/src/main/java/dev/architectury/transfer/wrapper/filtering/FilteringTransferView.java @@ -0,0 +1,71 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.transfer.wrapper.filtering; + +import dev.architectury.transfer.TransferAction; +import dev.architectury.transfer.TransferView; +import dev.architectury.transfer.view.ModifiableView; +import dev.architectury.transfer.wrapper.forwarding.ForwardingTransferView; + +import java.util.function.Predicate; + +public interface FilteringTransferView extends ForwardingTransferView, ModifiableView { + static FilteringTransferView of(TransferView delegate, Predicate canInsert, Predicate canExtract) { + return new FilteringTransferView() { + @Override + public TransferView forwardingTo() { + return delegate; + } + + @Override + public boolean canInsert(T toInsert) { + return canExtract.test(toInsert); + } + + @Override + public boolean canExtract(T toExtract) { + return canExtract.test(toExtract); + } + }; + } + + @Override + default long insert(T toInsert, TransferAction action) { + if (canInsert(toInsert)) { + return ForwardingTransferView.super.insert(toInsert, action); + } else { + return 0; + } + } + + @Override + default T extract(T toExtract, TransferAction action) { + if (canExtract(toExtract)) { + return ForwardingTransferView.super.extract(toExtract, action); + } else { + return blank(); + } + } + + @Override + default T extract(Predicate toExtract, long maxAmount, TransferAction action) { + return ForwardingTransferView.super.extract(toExtract.and(this::canExtract), maxAmount, action); + } +} diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java index 49aa5036..af73b720 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingResourceView.java @@ -22,7 +22,10 @@ package dev.architectury.transfer.wrapper.forwarding; import dev.architectury.transfer.ResourceView; import dev.architectury.transfer.TransferAction; -public interface ForwardingResourceView extends ResourceView { +import java.util.function.Predicate; + +public interface ForwardingResourceView extends ResourceView, ForwardingTransferView { + @Override ResourceView forwardingTo(); @Override @@ -36,28 +39,8 @@ public interface ForwardingResourceView extends ResourceView { } @Override - default T extract(T toExtract, TransferAction action) { - return forwardingTo().extract(toExtract, action); - } - - @Override - default T blank() { - return forwardingTo().blank(); - } - - @Override - default T copyWithAmount(T resource, long amount) { - return forwardingTo().copyWithAmount(resource, amount); - } - - @Override - default Object saveState() { - return forwardingTo().saveState(); - } - - @Override - default void loadState(Object state) { - forwardingTo().loadState(state); + default T extract(Predicate toExtract, long maxAmount, TransferAction action) { + return ResourceView.super.extract(toExtract, maxAmount, action); } @Override diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java index ce882ac1..8e3a2ba1 100644 --- a/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java +++ b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferHandler.java @@ -20,13 +20,12 @@ package dev.architectury.transfer.wrapper.forwarding; import dev.architectury.transfer.ResourceView; -import dev.architectury.transfer.TransferAction; import dev.architectury.transfer.TransferHandler; -import java.util.function.Predicate; import java.util.stream.Stream; -public interface ForwardingTransferHandler extends TransferHandler { +public interface ForwardingTransferHandler extends TransferHandler, ForwardingTransferView { + @Override TransferHandler forwardingTo(); default ResourceView forwardResource(ResourceView resource) { @@ -49,39 +48,4 @@ public interface ForwardingTransferHandler extends TransferHandler { default ResourceView getContent(int index) { return forwardResource(forwardingTo().getContent(index)); } - - @Override - default long insert(T toInsert, TransferAction action) { - return forwardingTo().insert(toInsert, action); - } - - @Override - default T extract(T toExtract, TransferAction action) { - return forwardingTo().extract(toExtract, action); - } - - @Override - default T extract(Predicate toExtract, long maxAmount, TransferAction action) { - return forwardingTo().extract(toExtract, maxAmount, action); - } - - @Override - default T blank() { - return forwardingTo().blank(); - } - - @Override - default T copyWithAmount(T resource, long amount) { - return forwardingTo().copyWithAmount(resource, amount); - } - - @Override - default Object saveState() { - return forwardingTo().saveState(); - } - - @Override - default void loadState(Object state) { - forwardingTo().loadState(state); - } } diff --git a/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferView.java b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferView.java new file mode 100644 index 00000000..6ad8c523 --- /dev/null +++ b/common/src/main/java/dev/architectury/transfer/wrapper/forwarding/ForwardingTransferView.java @@ -0,0 +1,64 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.transfer.wrapper.forwarding; + +import dev.architectury.transfer.TransferAction; +import dev.architectury.transfer.TransferView; + +import java.util.function.Predicate; + +public interface ForwardingTransferView extends TransferView { + TransferView forwardingTo(); + + @Override + default long insert(T toInsert, TransferAction action) { + return forwardingTo().insert(toInsert, action); + } + + @Override + default T extract(Predicate toExtract, long maxAmount, TransferAction action) { + return forwardingTo().extract(toExtract, maxAmount, action); + } + + @Override + default T extract(T toExtract, TransferAction action) { + return forwardingTo().extract(toExtract, action); + } + + @Override + default T blank() { + return forwardingTo().blank(); + } + + @Override + default T copyWithAmount(T resource, long amount) { + return forwardingTo().copyWithAmount(resource, amount); + } + + @Override + default Object saveState() { + return forwardingTo().saveState(); + } + + @Override + default void loadState(Object state) { + forwardingTo().loadState(state); + } +} diff --git a/common/src/main/java/dev/architectury/utils/Amount.java b/common/src/main/java/dev/architectury/utils/Amount.java index b425b1db..1ea955e9 100644 --- a/common/src/main/java/dev/architectury/utils/Amount.java +++ b/common/src/main/java/dev/architectury/utils/Amount.java @@ -1,3 +1,22 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + package dev.architectury.utils; public class Amount { diff --git a/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java b/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java index 90156477..4d9fe12b 100644 --- a/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java +++ b/fabric/src/main/java/dev/architectury/transfer/fabric/FabricStorageTransferHandler.java @@ -202,6 +202,26 @@ public class FabricStorageTransferHandler implements TransferHandler { return FabricStorageTransferHandler.this.copyWithAmount(resource, amount); } + @Override + public long insert(S toInsert, TransferAction action) { + if (view instanceof Storage) { + long inserted; + + try (Transaction nested = Transaction.openNested(this.transaction)) { + inserted = ((Storage) this.view).insert(toFabric(toInsert), getAmount(toInsert), nested); + + if (action == TransferAction.ACT) { + nested.commit(); + } + } + + return inserted; + } + + // impossible to insert to a fabric storage view with an index + return 0; + } + @Override public S extract(S toExtract, TransferAction action) { if (isEmpty(toExtract)) return blank(); diff --git a/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java b/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java index 034e58bd..895528a0 100644 --- a/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java +++ b/fabric/src/main/java/dev/architectury/transfer/item/fabric/FabricContainerItemTransferHandler.java @@ -161,6 +161,22 @@ public class FabricContainerItemTransferHandler implements TransferHandler