SimpleJavaEngine/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java

97 lines
2.0 KiB
Java

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<Consumer<Event>>[] unsortedListeners = new Set[EventPriority.values().length];
Consumer<Event>[] listeners = new Consumer[0];
boolean rebuild = true;
Listeners parent;
List<Listeners> childs = null;
public Listeners()
{
for(int i = 0;i<unsortedListeners.length;i++)
{
unsortedListeners[i] = new ObjectLinkedOpenHashSet<>();
}
}
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<Event> listener)
{
if(unsortedListeners[priority.getPriority()].add(listener))
{
markDirty();
}
}
public void removeListeners(Consumer<Event> listener)
{
for(int i = 0,m=unsortedListeners.length;i<m;i++)
{
if(unsortedListeners[i].remove(listener))
{
markDirty();
}
}
}
public void getListeners(EventPriority entry, List<Consumer<Event>> events)
{
events.addAll(unsortedListeners[entry.getPriority()]);
if(parent != null)
{
parent.getListeners(entry, events);
}
}
public Consumer<Event>[] 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<m;i++)
{
childs.get(i).markDirty();
}
}
}
public void rebuildListeners()
{
rebuild = false;
List<Consumer<Event>> result = new ObjectArrayList<>();
for(EventPriority entry : EventPriority.getPriorities())
{
getListeners(entry, result);
}
listeners = result.toArray(new Consumer[result.size()]);
}
}