package xapi.util.impl; import xapi.collect.api.Fifo; import xapi.collect.impl.SimpleFifo; import xapi.util.api.ProvidesValue; import xapi.util.api.ReceivesValue; public class DeferredMultiReceiver <X> implements ProvidesValue<ReceivesValue<X>>{ private final Fifo<ProvidesValue<ReceivesValue<X>>> providers; private final ReceivesValue<X> adapter; public DeferredMultiReceiver() { providers = new SimpleFifo<ProvidesValue<ReceivesValue<X>>>(); adapter = new ReceivesValue<X>(){ @Override public void set(X value) { ProvidesValue<ReceivesValue<X>> local; while((local=providers.take())!=null){ local.get().set(value); } local = null; } }; } public final void add(ProvidesValue<ReceivesValue<X>> provider){ assert !providers.contains(provider) : new RuntimeException("You have sent the same provider instance to a DeferredMultiReceiver more than once: "+provider); providers.give(provider); } public final void add(final ReceivesValue<X> provider){ ProviderAdapter<X> adapter = new ProviderAdapter<X>(); adapter.set(provider); providers.give(adapter); } @Override public final ReceivesValue<X> get() { return adapter; } }