package com.github.davidmoten.rx.internal.operators; import java.util.Iterator; import java.util.List; import rx.Observable; import rx.functions.Func1; public final class ObservableReverse { @SuppressWarnings("unchecked") public static <T> Observable<T> reverse(Observable<T> source) { return source.toList().flatMap((Func1<List<T>, Observable<T>>)(Func1<?,?>) REVERSE_LIST); } private static final Func1<List<Object>, Observable<Object>> REVERSE_LIST = new Func1<List<Object>, Observable<Object>>() { @Override public Observable<Object> call(List<Object> list) { return Observable.from(reverse(list)); } }; private static <T> Iterable<T> reverse(final List<T> list) { return new Iterable<T>() { @Override public Iterator<T> iterator() { return new Iterator<T>() { int i = list.size(); @Override public boolean hasNext() { return i > 0; } @Override public T next() { i--; return list.get(i); } @Override public void remove() { throw new UnsupportedOperationException(); } }; } }; } }