package me.tofaa.entitylib.event; import org.jetbrains.annotations.NotNull; import java.util.HashSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; final class EventBusAsync implements EventBus.Async { private final Map listeners = new ConcurrentHashMap(); private final ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); @Override public void addListener(@NotNull EventListener listener) { if (listeners.containsKey(listener.getEventClass())) { listeners.put(listener.getEventClass(), new HashSet<>()); } ((HashSet) listeners.get(listener.getEventClass())).add(listener); } @Override public void addListener(@NotNull Class eventClass, @NotNull Consumer consumer) { addListener(EventListener.generateListener(eventClass, consumer)); } @Override public void removeListener(@NotNull EventListener listener) { if (listeners.containsKey(listener.getEventClass())) { ((HashSet) listeners.get(listener.getEventClass())).remove(listener); } } @Override public @NotNull T call(@NotNull T event) { executor.execute(() -> dispatchEvent(event)); return event; } private void dispatchEvent(T event) { if (!listeners.containsKey(event.getClass())) return; HashSet> consumers = (HashSet>) listeners.get(event.getClass()); consumers.forEach(consumer -> consumer.handle(event)); } @Override public void call(@NotNull T event, @NotNull Consumer completionCallback) { executor.execute(() -> { dispatchEvent(event); completionCallback.accept(event); }); } }