KinderMalen/src/main/java/de/ph87/kindermalen/Publisher.java
2023-02-23 08:46:11 +01:00

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);
}
}
}