Minestom/src/main/java/net/minestom/server/event/EventBinding.java

68 lines
2.5 KiB
Java
Raw Normal View History

2021-08-14 01:39:45 +02:00
package net.minestom.server.event;
2021-08-17 02:58:12 +02:00
import org.jetbrains.annotations.ApiStatus;
2021-08-14 01:39:45 +02:00
import org.jetbrains.annotations.NotNull;
2021-08-16 07:58:58 +02:00
import java.util.Collection;
2021-08-14 01:39:45 +02:00
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
2021-08-16 07:58:58 +02:00
import java.util.function.Predicate;
2021-08-14 01:39:45 +02:00
2021-08-17 02:58:12 +02:00
@ApiStatus.Experimental
public interface EventBinding<E extends Event> {
2021-08-14 01:39:45 +02:00
2021-08-16 07:58:58 +02:00
static <E extends Event, T> @NotNull FilteredBuilder<E, T> filtered(@NotNull EventFilter<E, T> filter, @NotNull Predicate<T> predicate) {
return new FilteredBuilder<>(filter, predicate);
2021-08-14 01:39:45 +02:00
}
2021-08-16 07:58:58 +02:00
@NotNull Collection<Class<? extends Event>> eventTypes();
2021-08-14 01:39:45 +02:00
@NotNull Consumer<@NotNull E> consumer(@NotNull Class<? extends Event> eventType);
2021-08-16 07:58:58 +02:00
class FilteredBuilder<E extends Event, T> {
private final EventFilter<E, T> filter;
private final Predicate<T> predicate;
private final Map<Class<? extends Event>, BiConsumer<Object, E>> mapped = new HashMap<>();
2021-08-14 01:39:45 +02:00
2021-08-16 07:58:58 +02:00
FilteredBuilder(EventFilter<E, T> filter, Predicate<T> predicate) {
this.filter = filter;
this.predicate = predicate;
}
2021-08-14 01:39:45 +02:00
2021-08-16 07:58:58 +02:00
public <M extends E> FilteredBuilder<E, T> map(@NotNull Class<M> eventType,
@NotNull BiConsumer<@NotNull T, @NotNull M> consumer) {
//noinspection unchecked
2021-08-16 07:58:58 +02:00
this.mapped.put(eventType, (BiConsumer<Object, E>) consumer);
2021-08-14 01:39:45 +02:00
return this;
}
public @NotNull EventBinding<E> build() {
2021-08-16 07:58:58 +02:00
final var copy = Map.copyOf(mapped);
final var eventTypes = copy.keySet();
Map<Class<? extends Event>, Consumer<E>> consumers = new HashMap<>(eventTypes.size());
for (var eventType : eventTypes) {
final var consumer = copy.get(eventType);
consumers.put(eventType, event -> {
final T handler = filter.getHandler(event);
if (!predicate.test(handler)) return;
consumer.accept(handler, event);
});
}
return new EventBinding<>() {
2021-08-16 07:58:58 +02:00
@Override
public @NotNull Collection<Class<? extends Event>> eventTypes() {
return eventTypes;
}
@Override
public @NotNull Consumer<E> consumer(@NotNull Class<? extends Event> eventType) {
return consumers.get(eventType);
2021-08-16 07:58:58 +02:00
}
};
2021-08-14 01:39:45 +02:00
}
}
}