properly compute priorities

This commit is contained in:
dfsek 2021-07-21 22:17:04 -07:00
parent 2ea16f68a2
commit deb1063592
2 changed files with 20 additions and 11 deletions

View File

@ -3,15 +3,16 @@ package com.dfsek.terra.event;
import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.event.events.Event; import com.dfsek.terra.api.event.events.Event;
import com.dfsek.terra.api.event.events.FailThroughEvent; import com.dfsek.terra.api.event.events.FailThroughEvent;
import com.dfsek.terra.api.event.events.PackEvent;
import com.dfsek.terra.api.event.functional.EventContext; import com.dfsek.terra.api.event.functional.EventContext;
import com.dfsek.terra.api.util.reflection.ReflectionUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
public class EventContextImpl<T extends Event> implements EventContext<T>, Comparable<EventContextImpl<T>> { public class EventContextImpl<T extends Event> implements EventContext<T>, Comparable<EventContextImpl<?>> {
private final List<Consumer<T>> actions = new ArrayList<>(); private final List<Consumer<T>> actions = new ArrayList<>();
private int priority; private int priority;
private boolean failThrough = false; private boolean failThrough = false;
@ -19,11 +20,14 @@ public class EventContextImpl<T extends Event> implements EventContext<T>, Compa
private final TerraAddon addon; private final TerraAddon addon;
private final Class<? extends Event> eventClass; private final Type eventType;
public EventContextImpl(TerraAddon addon, Class<? extends Event> eventClass) { private final FunctionalEventHandlerImpl parent;
public EventContextImpl(TerraAddon addon, Type eventType, FunctionalEventHandlerImpl parent) {
this.addon = addon; this.addon = addon;
this.eventClass = eventClass; this.eventType = eventType;
this.parent = parent;
} }
public void handle(T event) { public void handle(T event) {
@ -39,13 +43,14 @@ public class EventContextImpl<T extends Event> implements EventContext<T>, Compa
@Override @Override
public EventContext<T> priority(int priority) { public EventContext<T> priority(int priority) {
this.priority = priority; this.priority = priority;
parent.recomputePriorities(eventType);
return this; return this;
} }
@Override @Override
public EventContext<T> failThrough() { public EventContext<T> failThrough() {
if(!FailThroughEvent.class.isAssignableFrom(eventClass)) { if(!FailThroughEvent.class.isAssignableFrom(ReflectionUtil.getRawType(eventType))) {
throw new IllegalStateException("Cannot fail-through on event which does not implement FailThroughEvent: " + eventClass.getCanonicalName()); throw new IllegalStateException("Cannot fail-through on event which does not implement FailThroughEvent: " + ReflectionUtil.typeToString(eventType));
} }
this.failThrough = true; this.failThrough = true;
return this; return this;
@ -58,7 +63,7 @@ public class EventContextImpl<T extends Event> implements EventContext<T>, Compa
} }
@Override @Override
public int compareTo(@NotNull EventContextImpl<T> o) { public int compareTo(@NotNull EventContextImpl<?> o) {
return this.priority - o.priority; return this.priority - o.priority;
} }

View File

@ -14,6 +14,7 @@ import java.io.StringWriter;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -52,16 +53,19 @@ public class FunctionalEventHandlerImpl implements FunctionalEventHandler {
@Override @Override
public <T extends Event> EventContext<T> register(TerraAddon addon, Class<T> clazz) { public <T extends Event> EventContext<T> register(TerraAddon addon, Class<T> clazz) {
EventContextImpl<T> eventContext = new EventContextImpl<>(addon, clazz); EventContextImpl<T> eventContext = new EventContextImpl<>(addon, clazz, this);
contextMap.computeIfAbsent(clazz, c -> new ArrayList<>()).add(eventContext); contextMap.computeIfAbsent(clazz, c -> new ArrayList<>()).add(eventContext);
return eventContext; return eventContext;
} }
@SuppressWarnings("unchecked")
@Override @Override
public <T extends Event> EventContext<T> register(TerraAddon addon, TypeKey<T> clazz) { public <T extends Event> EventContext<T> register(TerraAddon addon, TypeKey<T> clazz) {
EventContextImpl<T> eventContext = new EventContextImpl<>(addon, (Class<T>) clazz.getRawType()); EventContextImpl<T> eventContext = new EventContextImpl<>(addon, clazz.getType(), this);
contextMap.computeIfAbsent(clazz.getType(), c -> new ArrayList<>()).add(eventContext); contextMap.computeIfAbsent(clazz.getType(), c -> new ArrayList<>()).add(eventContext);
return eventContext; return eventContext;
} }
public void recomputePriorities(Type target) {
contextMap.get(target).sort(Comparator.naturalOrder());
}
} }