package speiger.src.coreengine.utils.eventbus; import java.util.List; import java.util.Set; import java.util.function.Consumer; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.collections.objects.sets.ObjectLinkedOpenHashSet; public class Listeners { Set>[] unsortedListeners = new Set[EventPriority.values().length]; Consumer[] listeners = new Consumer[0]; boolean rebuild = true; Listeners parent; List childs = null; public Listeners() { for(int i = 0;i(); } } public Listeners(Listeners parent) { this(); this.parent = parent; this.parent.addChild(this); } public void addChild(Listeners listener) { if(childs == null) childs = new ObjectArrayList<>(); childs.add(listener); } public void addListener(EventPriority priority, Consumer listener) { if(unsortedListeners[priority.getPriority()].add(listener)) { markDirty(); } } public void removeListeners(Consumer listener) { for(int i = 0,m=unsortedListeners.length;i> events) { events.addAll(unsortedListeners[entry.getPriority()]); if(parent != null) { parent.getListeners(entry, events); } } public Consumer[] getListeners() { if(rebuild) rebuildListeners(); return listeners; } private void markDirty() { if(rebuild) return; rebuild = true; if(childs != null) { for(int i = 0,m=childs.size();i> result = new ObjectArrayList<>(); for(EventPriority entry : EventPriority.getPriorities()) { getListeners(entry, result); } listeners = result.toArray(new Consumer[result.size()]); } }