diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java index 1e9cc2b5..1b171781 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/component/Pagination.java @@ -1,5 +1,6 @@ package me.devnatan.inventoryframework.component; +import me.devnatan.inventoryframework.state.StateValue; import me.devnatan.inventoryframework.state.StateValueHost; import org.jetbrains.annotations.ApiStatus; @@ -16,7 +17,7 @@ * during rendering, this component is determined from the {@link #currentPageIndex() current page * index}. */ -public interface Pagination extends ComponentComposition { +public interface Pagination extends ComponentComposition, StateValue { /** * The current page number. diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/AbstractStateValue.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/AbstractStateValue.java new file mode 100644 index 00000000..c459b6ba --- /dev/null +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/AbstractStateValue.java @@ -0,0 +1,40 @@ +package me.devnatan.inventoryframework.state; + +import org.jetbrains.annotations.ApiStatus; + +/** + * This is an internal inventory-framework API that should not be used from outside of + * this library. No compatibility guarantees are provided. + */ +@ApiStatus.Internal +public abstract class AbstractStateValue implements StateValue { + + private final State state; + + protected AbstractStateValue(State state) { + this.state = state; + } + + @Override + public final State getState() { + return state; + } + + @Override + public final long getId() { + return getState().internalId(); + } + + @Override + public abstract Object get(); + + @Override + public void set(Object value) { + throw new IllegalStateModificationException("Immutable"); + } + + @Override + public String toString() { + return "AbstractStateValue{" + "state=" + state + '}'; + } +} diff --git a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/StateValue.java b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/StateValue.java index 4fe519f7..babad84d 100644 --- a/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/StateValue.java +++ b/inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/StateValue.java @@ -5,60 +5,43 @@ /** * Wrapper of the value of a {@link State} for a single {@link StateValueHost}. + *

+ * This is an internal inventory-framework API that should not be used from outside of + * this library. No compatibility guarantees are provided. */ -// TODO Must be a interface to allow spread across "component as state" (like Pagination) -public abstract class StateValue { - - private final State state; - - public StateValue(State state) { - this.state = state; - } +@ApiStatus.Internal +public interface StateValue { /** - * The state who holds this value. + * The id of this state on its current host. * - * @return The state who holds this value. + * @return The state id. */ - public final State getState() { - return state; - } + long getId(); /** - * The id of this state on its current host. + * The state who holds this value. * - * @return The state id. + * @return The state who holds this value. */ - public final long getId() { - return getState().internalId(); - } + State getState(); /** * The current state value. *

* The value returned and consistency with values returned by the same earlier is unknown as * this is implementation defined. - *

- * This is an internal inventory-framework API that should not be used from outside of - * this library. No compatibility guarantees are provided. * * @return The current state value. */ - @ApiStatus.Internal @UnknownNullability - protected abstract Object get(); + Object get(); /** * Sets the new state value. - *

- * This is an internal inventory-framework API that should not be used from outside of - * this library. No compatibility guarantees are provided. * * @param value The new value. * @throws StateException If this value can't be set. */ - @ApiStatus.Internal - protected void set(Object value) { - throw new IllegalStateModificationException("Immutable"); - } + void set(Object value); } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java index 5154f0e7..893824f4 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/component/PaginationImpl.java @@ -20,15 +20,15 @@ import me.devnatan.inventoryframework.context.IFSlotClickContext; import me.devnatan.inventoryframework.context.IFSlotRenderContext; import me.devnatan.inventoryframework.internal.LayoutSlot; +import me.devnatan.inventoryframework.state.AbstractStateValue; import me.devnatan.inventoryframework.state.State; -import me.devnatan.inventoryframework.state.StateValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.UnmodifiableView; import org.jetbrains.annotations.VisibleForTesting; // TODO add "key" to child pagination components and check if it needs to be updated based on it @VisibleForTesting -public class PaginationImpl extends StateValue implements Pagination, InteractionHandler { +public class PaginationImpl extends AbstractStateValue implements Pagination, InteractionHandler { private final List components = new LinkedList<>(); private final @NotNull IFContext host; @@ -323,7 +323,9 @@ public Object get() { } @Override - protected void set(Object value) {} + public void set(Object value) { + // do nothing since Pagination is not immutable but unmodifiable directly + } @Override public @NotNull VirtualView getRoot() { diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ComputedValue.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ComputedValue.java index 20552835..6a63b3d2 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ComputedValue.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ComputedValue.java @@ -8,12 +8,12 @@ /** * Computed value whose value returned by the function to get the state value is always a new value * created by {@link ComputedValue#factory}. - * + *

* This is an internal inventory-framework API that should not be used from outside of * this library. No compatibility guarantees are provided. */ @ApiStatus.Internal -public final class ComputedValue extends StateValue { +public final class ComputedValue extends AbstractStateValue { private final Supplier factory; diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ImmutableValue.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ImmutableValue.java index 49a2802e..640eb8f6 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ImmutableValue.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/ImmutableValue.java @@ -2,18 +2,17 @@ import java.util.Objects; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; /** * This is an internal inventory-framework API that should not be used from outside of * this library. No compatibility guarantees are provided. */ @ApiStatus.Internal -public final class ImmutableValue extends StateValue { +public final class ImmutableValue extends AbstractStateValue { private final Object value; - public ImmutableValue(@NotNull State state, Object value) { + public ImmutableValue(State state, Object value) { super(state); this.value = value; } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/InitialDataStateValue.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/InitialDataStateValue.java index 16479abe..aed718bb 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/InitialDataStateValue.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/InitialDataStateValue.java @@ -11,7 +11,7 @@ * this library. No compatibility guarantees are provided. */ @ApiStatus.Internal -public final class InitialDataStateValue extends StateValue { +public final class InitialDataStateValue extends AbstractStateValue { private final StateValue backingValue; diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/LazyValue.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/LazyValue.java index 256aa64b..9fd5ae53 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/LazyValue.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/LazyValue.java @@ -10,19 +10,19 @@ *

* The initial state value is set by a {@link LazyValue#computation}, and this value remains the * {@link LazyValue#currValue current value} throughout the lifecycle of that value. - * + *

* This is an internal inventory-framework API that should not be used from outside of * this library. No compatibility guarantees are provided. */ @ApiStatus.Internal -public final class LazyValue extends StateValue { +public final class LazyValue extends AbstractStateValue { private static final Object UNINITIALIZED = new Object(); private final Supplier computation; private Object currValue = UNINITIALIZED; - public LazyValue(@NotNull State state, @NotNull Supplier computation) { + public LazyValue(State state, @NotNull Supplier computation) { super(state); this.computation = computation; } @@ -30,7 +30,6 @@ public LazyValue(@NotNull State state, @NotNull Supplier computation) { @Override public Object get() { if (currValue.equals(UNINITIALIZED)) currValue = computation.get(); - return currValue; } diff --git a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/MutableValue.java b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/MutableValue.java index 7e011518..1bc8a8b4 100644 --- a/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/MutableValue.java +++ b/inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/MutableValue.java @@ -2,18 +2,17 @@ import java.util.Objects; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; /** * This is an internal inventory-framework API that should not be used from outside of * this library. No compatibility guarantees are provided. */ @ApiStatus.Internal -public class MutableValue extends StateValue { +public class MutableValue extends AbstractStateValue { private Object currValue; - public MutableValue(@NotNull State state, Object currValue) { + public MutableValue(State state, Object currValue) { super(state); this.currValue = currValue; }