package it.cavallium.warppi.util; import java.util.LinkedList; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; public class EventSubmitter implements EventSubscriber, Submitter { private boolean initialized = false; private T value; private List> subscribers = new LinkedList<>(); public EventSubmitter() { value = null; } public EventSubmitter(T defaultValue) { this.value = defaultValue; this.initialized = true; } public static EventSubmitter create() { return new EventSubmitter<>(); } public static EventSubmitter create(T value) { return new EventSubmitter<>(value); } @Override public T getLastValue() { return value; } @Override public void subscribe(Consumer action) { T currentValue = value; var newSubscribers = new LinkedList<>(subscribers); if (initialized) { action.accept(currentValue); } newSubscribers.add(action); subscribers = newSubscribers; } @Override public void submit(T value) { this.value = value; this.initialized = true; for (Consumer subscriber : subscribers) { subscriber.accept(value); } } @Override public EventSubmitter map(Function mapFunction) { var eventSubmitter = new EventSubmitter(); map(eventSubmitter, mapFunction); return eventSubmitter; } }