Skip to content

Commit 5db9dfe

Browse files
committed
feat: timer state
1 parent df816b6 commit 5db9dfe

File tree

5 files changed

+64
-20
lines changed

5 files changed

+64
-20
lines changed

inventory-framework-api/src/main/java/me/devnatan/inventoryframework/ViewConfigBuilder.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.Set;
99
import java.util.stream.Collectors;
1010
import me.devnatan.inventoryframework.exception.InvalidLayoutException;
11+
import me.devnatan.inventoryframework.state.TimerState;
1112
import org.jetbrains.annotations.ApiStatus;
1213
import org.jetbrains.annotations.NotNull;
1314

@@ -31,6 +32,7 @@ public final class ViewConfigBuilder {
3132
private String[] layout = null;
3233
private final Set<ViewConfig.Modifier> modifiers = new HashSet<>();
3334
private long updateIntervalInTicks, interactionDelayInMillis;
35+
private TimerState updateIntervalState;
3436
private boolean transitiveInitialData;
3537

3638
/**
@@ -200,6 +202,19 @@ public ViewConfigBuilder scheduleUpdate(long intervalInTicks) {
200202
return this;
201203
}
202204

205+
/**
206+
* Schedules the view to update every fixed interval.
207+
*
208+
* @param timerState The
209+
* @return This configuration builder.
210+
* @see <a href="https://github.com/DevNatan/inventory-framework/wiki/scheduled-updates">Scheduled Updates on Wiki</a>
211+
*/
212+
@ApiStatus.Experimental
213+
public ViewConfigBuilder scheduleUpdate(TimerState timerState) {
214+
this.updateIntervalState = timerState;
215+
return this;
216+
}
217+
203218
/**
204219
* Waits a fixed delay before any player interaction.
205220
* <p>

inventory-framework-api/src/main/java/me/devnatan/inventoryframework/internal/ElementFactory.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import me.devnatan.inventoryframework.context.IFSlotClickContext;
1818
import me.devnatan.inventoryframework.context.IFSlotRenderContext;
1919
import me.devnatan.inventoryframework.logging.Logger;
20+
import me.devnatan.inventoryframework.state.TimerState;
2021
import org.jetbrains.annotations.NotNull;
2122
import org.jetbrains.annotations.Nullable;
2223

@@ -88,4 +89,6 @@ public abstract IFSlotRenderContext createSlotRenderContext(
8889
public abstract boolean worksInCurrentPlatform();
8990

9091
public abstract Job scheduleJobInterval(@NotNull RootView root, long intervalInTicks, @NotNull Runnable execution);
92+
93+
public abstract TimerState createTimerState(long stateId, long intervalInTicks);
9194
}

inventory-framework-api/src/main/java/me/devnatan/inventoryframework/state/StateAccess.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,19 @@ public interface StateAccess<
173173
*/
174174
<T> MutableState<T> initialState(@NotNull String key);
175175

176+
/**
177+
* Creates a new unmodifiable timer state.
178+
*
179+
* @param intervalInTicks Ticks to schedule the timer to run.
180+
* <p>
181+
* <b><i> This API is experimental and is not subject to the general compatibility guarantees
182+
* such API may be changed or may be removed completely in any further release. </i></b>
183+
*
184+
* @return A new unmodifiable timer state.
185+
*/
186+
@ApiStatus.Experimental
187+
TimerState timerState(long intervalInTicks);
188+
176189
/**
177190
* Creates a new immutable pagination with static data source.
178191
*
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package me.devnatan.inventoryframework.state;
2+
3+
public interface TimerState extends State<TimerState.Timer> {
4+
5+
interface Timer {}
6+
}

inventory-framework-core/src/main/java/me/devnatan/inventoryframework/state/StateAccessImpl.java

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public StateAccessImpl(Object caller, ElementFactory elementFactory, StateRegist
3838
}
3939

4040
@Override
41-
public final <T> State<T> state(T initialValue) {
41+
public <T> State<T> state(T initialValue) {
4242
final long id = State.next();
4343
final StateValueFactory factory = (host, state) -> new ImmutableValue(state, initialValue);
4444
final State<T> state = new BaseState<>(id, factory);
@@ -48,7 +48,7 @@ public final <T> State<T> state(T initialValue) {
4848
}
4949

5050
@Override
51-
public final <T> MutableState<T> mutableState(T initialValue) {
51+
public <T> MutableState<T> mutableState(T initialValue) {
5252
final long id = State.next();
5353
final StateValueFactory factory = (host, state) -> new MutableValue(state, initialValue);
5454
final MutableState<T> state = new MutableGenericStateImpl<>(id, factory);
@@ -58,7 +58,7 @@ public final <T> MutableState<T> mutableState(T initialValue) {
5858
}
5959

6060
@Override
61-
public final MutableIntState mutableState(int initialValue) {
61+
public MutableIntState mutableState(int initialValue) {
6262
final long id = State.next();
6363
final StateValueFactory factory = (host, state) -> new MutableValue(state, initialValue);
6464
final MutableIntState state = new MutableIntStateImpl(id, factory);
@@ -68,7 +68,7 @@ public final MutableIntState mutableState(int initialValue) {
6868
}
6969

7070
@Override
71-
public final <T> State<T> computedState(@NotNull Function<Context, T> computation) {
71+
public <T> State<T> computedState(@NotNull Function<Context, T> computation) {
7272
final long id = State.next();
7373
@SuppressWarnings("unchecked")
7474
final StateValueFactory factory =
@@ -80,7 +80,7 @@ public final <T> State<T> computedState(@NotNull Function<Context, T> computatio
8080
}
8181

8282
@Override
83-
public final <T> State<T> computedState(@NotNull Supplier<T> computation) {
83+
public <T> State<T> computedState(@NotNull Supplier<T> computation) {
8484
final long id = State.next();
8585
final StateValueFactory factory = (host, state) -> new ComputedValue(state, computation);
8686
final State<T> state = new BaseState<>(id, factory);
@@ -90,7 +90,7 @@ public final <T> State<T> computedState(@NotNull Supplier<T> computation) {
9090
}
9191

9292
@Override
93-
public final <T> State<T> lazyState(@NotNull Function<Context, T> computation) {
93+
public <T> State<T> lazyState(@NotNull Function<Context, T> computation) {
9494
final long id = State.next();
9595
@SuppressWarnings("unchecked")
9696
final StateValueFactory factory =
@@ -102,7 +102,7 @@ public final <T> State<T> lazyState(@NotNull Function<Context, T> computation) {
102102
}
103103

104104
@Override
105-
public final <T> State<T> lazyState(@NotNull Supplier<T> computation) {
105+
public <T> State<T> lazyState(@NotNull Supplier<T> computation) {
106106
final long id = State.next();
107107
final StateValueFactory factory = (host, state) -> new LazyValue(state, computation);
108108
final State<T> state = new BaseState<>(id, factory);
@@ -113,13 +113,13 @@ public final <T> State<T> lazyState(@NotNull Supplier<T> computation) {
113113

114114
@SuppressWarnings("DataFlowIssue")
115115
@Override
116-
public final <T> MutableState<T> initialState() {
116+
public <T> MutableState<T> initialState() {
117117
return initialState(null);
118118
}
119119

120120
@SuppressWarnings("NullableProblems")
121121
@Override
122-
public final <T> MutableState<T> initialState(@NotNull String key) {
122+
public <T> MutableState<T> initialState(@NotNull String key) {
123123
final long id = State.next();
124124
final MutableState<T> state =
125125
new BaseMutableState<>(id, (host, valueState) -> new InitialDataStateValue(valueState, host, key));
@@ -129,7 +129,14 @@ public final <T> MutableState<T> initialState(@NotNull String key) {
129129
}
130130

131131
@Override
132-
public final <T> State<Pagination> paginationState(
132+
public TimerState timerState(long intervalInTicks) {
133+
final TimerState state = elementFactory.createTimerState(State.next(), intervalInTicks);
134+
this.stateRegistry.registerState(state, this);
135+
return state;
136+
}
137+
138+
@Override
139+
public <T> State<Pagination> paginationState(
133140
@NotNull List<? super T> sourceProvider,
134141
@NotNull PaginationValueConsumer<Context, ItemBuilder, T> elementConsumer) {
135142
return this.<T>buildPaginationState(sourceProvider)
@@ -138,7 +145,7 @@ public final <T> State<Pagination> paginationState(
138145
}
139146

140147
@Override
141-
public final <T> State<Pagination> computedPaginationState(
148+
public <T> State<Pagination> computedPaginationState(
142149
@NotNull Function<Context, List<? super T>> sourceProvider,
143150
@NotNull PaginationValueConsumer<Context, ItemBuilder, T> valueConsumer) {
144151
return this.buildComputedPaginationState(sourceProvider)
@@ -147,7 +154,7 @@ public final <T> State<Pagination> computedPaginationState(
147154
}
148155

149156
@Override
150-
public final <T> State<Pagination> computedAsyncPaginationState(
157+
public <T> State<Pagination> computedAsyncPaginationState(
151158
@NotNull Function<Context, CompletableFuture<List<T>>> sourceProvider,
152159
@NotNull PaginationValueConsumer<Context, ItemBuilder, T> valueConsumer) {
153160
return this.buildComputedAsyncPaginationState(sourceProvider)
@@ -156,7 +163,7 @@ public final <T> State<Pagination> computedAsyncPaginationState(
156163
}
157164

158165
@Override
159-
public final <T> State<Pagination> lazyPaginationState(
166+
public <T> State<Pagination> lazyPaginationState(
160167
@NotNull Function<Context, List<? super T>> sourceProvider,
161168
@NotNull PaginationValueConsumer<Context, ItemBuilder, T> valueConsumer) {
162169
return this.buildLazyPaginationState(sourceProvider)
@@ -183,48 +190,48 @@ public <T> State<Pagination> lazyAsyncPaginationState(
183190
}
184191

185192
@Override
186-
public final <T> PaginationStateBuilder<Context, ItemBuilder, T> buildPaginationState(
193+
public <T> PaginationStateBuilder<Context, ItemBuilder, T> buildPaginationState(
187194
@NotNull List<? super T> sourceProvider) {
188195
return new PaginationStateBuilder<>(
189196
this.elementFactory, sourceProvider, this::createPaginationState, false, false);
190197
}
191198

192199
@Override
193-
public final <T> PaginationStateBuilder<Context, ItemBuilder, T> buildComputedPaginationState(
200+
public <T> PaginationStateBuilder<Context, ItemBuilder, T> buildComputedPaginationState(
194201
@NotNull Function<Context, List<? super T>> sourceProvider) {
195202
return new PaginationStateBuilder<>(
196203
this.elementFactory, sourceProvider, this::createPaginationState, false, true);
197204
}
198205

199206
@Override
200-
public final <T> PaginationStateBuilder<Context, ItemBuilder, T> buildComputedAsyncPaginationState(
207+
public <T> PaginationStateBuilder<Context, ItemBuilder, T> buildComputedAsyncPaginationState(
201208
@NotNull Function<Context, CompletableFuture<List<T>>> sourceProvider) {
202209
return new PaginationStateBuilder<>(
203210
this.elementFactory, sourceProvider, this::createPaginationState, true, true);
204211
}
205212

206213
@Override
207-
public final <T> PaginationStateBuilder<Context, ItemBuilder, T> buildLazyPaginationState(
214+
public <T> PaginationStateBuilder<Context, ItemBuilder, T> buildLazyPaginationState(
208215
@NotNull Supplier<List<? super T>> sourceProvider) {
209216
return new PaginationStateBuilder<>(
210217
this.elementFactory, sourceProvider, this::createPaginationState, false, false);
211218
}
212219

213220
@Override
214-
public final <T> PaginationStateBuilder<Context, ItemBuilder, T> buildLazyPaginationState(
221+
public <T> PaginationStateBuilder<Context, ItemBuilder, T> buildLazyPaginationState(
215222
@NotNull Function<Context, List<? super T>> sourceProvider) {
216223
return new PaginationStateBuilder<>(
217224
this.elementFactory, sourceProvider, this::createPaginationState, false, false);
218225
}
219226

220227
@Override
221-
public final <T> PaginationStateBuilder<Context, ItemBuilder, T> buildLazyAsyncPaginationState(
228+
public <T> PaginationStateBuilder<Context, ItemBuilder, T> buildLazyAsyncPaginationState(
222229
@NotNull Function<Context, CompletableFuture<List<T>>> sourceProvider) {
223230
return new PaginationStateBuilder<>(
224231
this.elementFactory, sourceProvider, this::createPaginationState, true, false);
225232
}
226233

227-
protected final <V> State<Pagination> createPaginationState(
234+
private <V> State<Pagination> createPaginationState(
228235
@NotNull PaginationStateBuilder<Context, ItemBuilder, V> builder) {
229236
final long id = State.next();
230237
@SuppressWarnings({"unchecked", "rawtypes"})

0 commit comments

Comments
 (0)