diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java b/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java new file mode 100644 index 00000000..8cb32cd5 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/tickables/LoadableTickableObject.java @@ -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 implements TickableObject { + private volatile int ticksInactive = 0; + private final int timeout; + private final Supplier loader; + private final Consumer finalizer; + private volatile T theObject = null; + + public LoadableTickableObject(int timeout, Supplier loader, Consumer finalizer) { + this(timeout, loader, finalizer, null); + } + + public LoadableTickableObject(int timeout, Supplier loader, Consumer 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; + } + } + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java new file mode 100644 index 00000000..cc31c47f --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObject.java @@ -0,0 +1,5 @@ +package org.embeddedt.modernfix.tickables; + +public interface TickableObject { + void tick(); +} diff --git a/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java new file mode 100644 index 00000000..4ec5f8e8 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/tickables/TickableObjectManager.java @@ -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 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(); + } + } +}