package it.cavallium.warppi.util; import java.util.function.Consumer; import java.util.function.Function; public interface EventSubscriber { /** * * @return Last value, or null */ T getLastValue(); void subscribe(Consumer action); default EventSubscriber map(Function mapFunction) { var eventSubmitter = new EventSubmitter(); map(this, eventSubmitter, mapFunction); return eventSubmitter; } default void map(EventSubmitter targetHandler, Function mapFunction) { map(this, targetHandler, mapFunction); } static void map(EventSubscriber originalEventHandler, EventSubmitter mappedEventHandler, Function mapFunction) { originalEventHandler.subscribe((value) -> { mappedEventHandler.submit(mapFunction.apply(value)); }); } }