package netflix.ocelli;
import netflix.ocelli.InstanceToNotification.InstanceNotification;
import rx.Notification;
import rx.Observable;
import rx.functions.Func1;
public class InstanceToNotification<T> implements Func1<Instance<T>, Observable<InstanceNotification<T>>> {
public static <T> InstanceToNotification<T> create() {
return new InstanceToNotification<T>();
}
public enum Kind {
OnAdd,
OnRemove
}
public static class InstanceNotification<T> {
private final Instance<T> value;
private final Kind kind;
public InstanceNotification(Instance<T> instance, Kind kind) {
this.value = instance;
this.kind = kind;
}
public Kind getKind() {
return kind;
}
public Instance<T> getInstance() {
return value;
}
public String toString() {
return "Notification[" + value + " " + kind + "]";
}
}
@Override
public Observable<InstanceNotification<T>> call(final Instance<T> instance) {
return Observable
.just(new InstanceNotification<T>(instance, Kind.OnAdd))
.concatWith(instance.getLifecycle().materialize().map(new Func1<Notification<Void>, InstanceNotification<T>>() {
@Override
public InstanceNotification<T> call(Notification<Void> t1) {
return new InstanceNotification<T>(instance, Kind.OnRemove);
}
}));
}
}