45 lines
1.0 KiB
Java
45 lines
1.0 KiB
Java
package de.ph87.kindermalen;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.function.Consumer;
|
|
|
|
public class Publisher<T> {
|
|
|
|
private final List<Subscription<T>> subscriptions = new ArrayList<>();
|
|
|
|
private T last = null;
|
|
|
|
private boolean signalling = false;
|
|
|
|
public void publish(final T item) {
|
|
synchronized (subscriptions) {
|
|
if (signalling) {
|
|
throw new RuntimeException();
|
|
}
|
|
signalling = true;
|
|
last = item;
|
|
new ArrayList<>(subscriptions).forEach(o -> o.next(item));
|
|
signalling = false;
|
|
}
|
|
}
|
|
|
|
public Subscription<T> subscribe(final Consumer<T> next) {
|
|
final Subscription<T> subscription = new Subscription<>(next, this::unsubscribe);
|
|
synchronized (subscriptions) {
|
|
subscriptions.add(subscription);
|
|
if (last != null) {
|
|
subscription.next(last);
|
|
}
|
|
}
|
|
return subscription;
|
|
}
|
|
|
|
private void unsubscribe(final Subscription<T> subscription) {
|
|
synchronized (subscriptions) {
|
|
subscriptions.remove(subscription);
|
|
}
|
|
}
|
|
|
|
}
|