package com.github.davidmoten.rx.util;
import java.util.Iterator;
import rx.Observable;
import rx.Observable.Transformer;
import rx.functions.Func2;
import com.github.davidmoten.rx.util.MapWithIndex.Indexed;
public final class MapWithIndex<T> implements Transformer<T, Indexed<T>> {
private static class Holder {
static final MapWithIndex<?> INSTANCE = new MapWithIndex<Object>();
}
@SuppressWarnings("unchecked")
public static <T> MapWithIndex<T> instance() {
return (MapWithIndex<T>) Holder.INSTANCE;
}
@Override
public Observable<Indexed<T>> call(Observable<T> source) {
return source.zipWith(NaturalNumbers.instance(), new Func2<T, Long, Indexed<T>>() {
@Override
public Indexed<T> call(T t, Long n) {
return new Indexed<T>(t, n);
}
});
}
public static final class Indexed<T> {
private final long index;
private final T value;
public Indexed(T value, long index) {
this.index = index;
this.value = value;
}
@Override
public String toString() {
return index + "->" + value;
}
public long index() {
return index;
}
public T value() {
return value;
}
}
private static final class NaturalNumbers implements Iterable<Long> {
private static class Holder {
static final NaturalNumbers INSTANCE = new NaturalNumbers();
}
static NaturalNumbers instance() {
return Holder.INSTANCE;
}
@Override
public Iterator<Long> iterator() {
return new Iterator<Long>() {
private long n = 0;
@Override
public boolean hasNext() {
return true;
}
@Override
public Long next() {
return n++;
}
@Override
public void remove() {
throw new RuntimeException("not supported");
}
};
}
}
}