package org.fxmisc.easybind; @FunctionalInterface public interface Subscription { void unsubscribe(); /** * Returns a new aggregate subscription whose {@link #unsubscribe()} * method calls {@code unsubscribe()} on both this subscription and * {@code other} subscription. */ default Subscription and(Subscription other) { return new BiSubscription(this, other); } static final Subscription EMPTY = () -> {}; /** * Returns a new aggregate subscription whose {@link #unsubscribe()} * method calls {@code unsubscribe()} on all arguments to this method. */ static Subscription multi(Subscription... subs) { switch(subs.length) { case 0: return EMPTY; case 1: return subs[0]; case 2: return new BiSubscription(subs[0], subs[1]); default: return new MultiSubscription(subs); } } } class BiSubscription implements Subscription { private final Subscription s1; private final Subscription s2; public BiSubscription(Subscription s1, Subscription s2) { this.s1 = s1; this.s2 = s2; } @Override public void unsubscribe() { s1.unsubscribe(); s2.unsubscribe(); } } class MultiSubscription implements Subscription { private final Subscription[] subscriptions; public MultiSubscription(Subscription... subscriptions) { this.subscriptions = subscriptions; } @Override public void unsubscribe() { for(Subscription s: subscriptions) { s.unsubscribe(); } } }