package au.gov.amsa.util.rx;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.log4j.Logger;
import rx.Observable.Operator;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.functions.Func2;
import rx.observers.Subscribers;
public class OperatorMapEntries<A, B, C> implements Operator<C, Map<A, B>> {
private static Logger log = Logger.getLogger(OperatorMapEntries.class);
private final Func2<A, B, C> function;
public OperatorMapEntries(Func2<A, B, C> function) {
this.function = function;
}
@Override
public Subscriber<? super Map<A, B>> call(final Subscriber<? super C> child) {
final AtomicBoolean subscribed = new AtomicBoolean(true);
child.add(new Subscription() {
@Override
public void unsubscribe() {
subscribed.set(false);
}
@Override
public boolean isUnsubscribed() {
return !subscribed.get();
}
});
Subscriber<Map<A, B>> parent = Subscribers
.from(new Observer<Map<A, B>>() {
@Override
public void onCompleted() {
child.onCompleted();
}
@Override
public void onError(Throwable e) {
child.onError(e);
}
@Override
public void onNext(Map<A, B> map) {
log.info("emitting map with " + map.size() + " entries");
for (Entry<A, B> entry : map.entrySet()) {
if (subscribed.get()) {
child.onNext(function.call(entry.getKey(),
entry.getValue()));
} else
return;
}
}
});
child.add(parent);
return parent;
}
}