Add tickable object framework
This commit is contained in:
parent
b0ab187da8
commit
cfd3920c8c
|
|
@ -0,0 +1,47 @@
|
||||||
|
package org.embeddedt.modernfix.tickables;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public class LoadableTickableObject<T> implements TickableObject {
|
||||||
|
private volatile int ticksInactive = 0;
|
||||||
|
private final int timeout;
|
||||||
|
private final Supplier<T> loader;
|
||||||
|
private final Consumer<T> finalizer;
|
||||||
|
private volatile T theObject = null;
|
||||||
|
|
||||||
|
public LoadableTickableObject(int timeout, Supplier<T> loader, Consumer<T> finalizer) {
|
||||||
|
this(timeout, loader, finalizer, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LoadableTickableObject(int timeout, Supplier<T> loader, Consumer<T> finalizer, @Nullable T initialValue) {
|
||||||
|
this.timeout = timeout;
|
||||||
|
this.loader = loader;
|
||||||
|
this.finalizer = finalizer;
|
||||||
|
this.theObject = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T get() {
|
||||||
|
synchronized (this) {
|
||||||
|
ticksInactive++;
|
||||||
|
T obj = theObject;
|
||||||
|
if(obj == null) {
|
||||||
|
obj = loader.get();
|
||||||
|
theObject = obj;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void tick() {
|
||||||
|
synchronized (this) {
|
||||||
|
ticksInactive++;
|
||||||
|
if(ticksInactive >= this.timeout) {
|
||||||
|
finalizer.accept(theObject);
|
||||||
|
theObject = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.embeddedt.modernfix.tickables;
|
||||||
|
|
||||||
|
public interface TickableObject {
|
||||||
|
void tick();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package org.embeddedt.modernfix.tickables;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
|
public class TickableObjectManager {
|
||||||
|
private static final List<TickableObject> TICKABLE_OBJECT_LIST = new CopyOnWriteArrayList<>();
|
||||||
|
|
||||||
|
public static void register(TickableObject object) {
|
||||||
|
TICKABLE_OBJECT_LIST.add(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void runTick() {
|
||||||
|
for(TickableObject o : TICKABLE_OBJECT_LIST) {
|
||||||
|
o.tick();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user