xapi.util.impl.DeferredMultiReceiver Maven / Gradle / Ivy
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 implements ProvidesValue>{
private final Fifo>> providers;
private final ReceivesValue adapter;
public DeferredMultiReceiver() {
providers = new SimpleFifo>>();
adapter = new ReceivesValue(){
@Override
public void set(X value) {
ProvidesValue> local;
while((local=providers.take())!=null){
local.get().set(value);
}
local = null;
}
};
}
public final void add(ProvidesValue> 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 provider){
ProviderAdapter adapter = new ProviderAdapter();
adapter.set(provider);
providers.give(adapter);
}
@Override
public final ReceivesValue get() {
return adapter;
}
}