Skip to content

Instantly share code, notes, and snippets.

@Eirenliel
Last active February 12, 2016 06:26
Show Gist options
  • Save Eirenliel/26712f0e7af26553b671 to your computer and use it in GitHub Desktop.
Save Eirenliel/26712f0e7af26553b671 to your computer and use it in GitHub Desktop.
package essentia.event;
import java.util.List;
import java.util.Map;
import essentia.util.collections.FastList;
import gnu.trove.map.hash.THashMap;
public class EventBus {
public Map<Object, List<Object>> eventReceivers = new THashMap<>();
@SuppressWarnings("unchecked")
public void addNewReceiver(EventReceiver receiver) {
for(Class<? extends Event<?>> event : receiver.getAllAvailableEvents()) {
addNewreceiver((Class<Event<Object>>) event, receiver);
}
}
public <T> void removeReceiver(Class<? extends Event<T>> clazz, T receiver) {
List<Object> receivers = eventReceivers.get(clazz);
if(receivers == null)
return;
receivers.remove(receiver);
}
public <T> void addNewReceiver(Class<? extends Event<T>> clazz, T receiver) {
List<Object> receivers = eventReceivers.get(clazz);
if(receivers == null) {
receivers = new FastList<>();
eventReceivers.put(clazz, receivers);
}
receivers.add(receiver);
}
@SuppressWarnings("unchecked")
public <T> void executeEvent(Event<T> event) {
List<T> receivers = (List<T>) eventReceivers.get(event.getClass());
for(int i = 0; i < receivers.size(); ++i)
event.execute(receivers.get(i));
}
public static interface Event<T> {
public void execute(T eventReceiver);
}
public static interface EventReceiver {
public Class<? extends Event<?>>[] getAllAvailableEvents();
}
public static class TestEvent implements Event<TestEventReceiver> {
@Override
public void execute(TestEventReceiver eventReceiver) {
eventReceiver.executeEvent(this);
}
}
public static class SecondTestEvent implements Event<SecondTestEventReceiver> {
@Override
public void execute(SecondTestEventReceiver eventReceiver) {
eventReceiver.executeEvent(this);
}
}
public abstract interface SecondTestEventReceiver {
public void executeEvent(SecondTestEvent event);
}
public static class TestEventReceiver implements EventReceiver {
public void executeEvent(TestEvent event) {
// TODO Do some cool code with event
}
@SuppressWarnings("unchecked")
@Override
public Class<? extends Event<?>>[] getAllAvailableEvents() {
return (Class<? extends Event<?>>[]) new Class[] {TestEvent.class};
}
}
static {
// Example code:
EventBus bus = new EventBus();
// Register single event:
bus.addNewReceiver(TestEvent.class, new TestEventReceiver());
// Register all events:
bus.addNewReceiver(new TestEventReceiver());
// Remove receiver from single event:
bus.removeReceiver(TestEvent.class, new TestEventReceiver());
// Execute event:
bus.executeEvent(new TestEvent());
// Lambda example
bus.addNewReceiver(SecondTestEvent.class, (SecondTestEvent) -> {});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment