package com.reactnativenavigation.events;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public enum EventBus {
instance;
private final List<WeakReference<Subscriber>> subscribers = new ArrayList<>();
public void register(Subscriber subscriber) {
if (isSubscribed(subscriber)) return;
subscribers.add(new WeakReference<>(subscriber));
}
public void unregister(Subscriber subscriber) {
ListIterator<WeakReference<Subscriber>> iterator = subscribers.listIterator();
while (iterator.hasNext()) {
WeakReference<Subscriber> ref = iterator.next();
Subscriber registered = ref.get();
if (registered != null && registered == subscriber) {
iterator.remove();
}
}
}
public void post(Event event) {
ListIterator<WeakReference<Subscriber>> iterator = subscribers.listIterator();
while (iterator.hasNext()) {
WeakReference<Subscriber> ref = iterator.next();
Subscriber registered = ref.get();
if (registered != null) {
registered.onEvent(event);
}
}
}
public boolean isSubscribed(Subscriber subscriber) {
for (WeakReference<Subscriber> ref : subscribers) {
Subscriber registered = ref.get();
if (registered != null && registered.equals(subscriber)) {
return true;
}
}
return false;
}
}