package com.simplecity.amp_library.sql.sqlbrite;
import android.database.Cursor;
import com.squareup.sqlbrite.SqlBrite;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.exceptions.Exceptions;
import rx.exceptions.OnErrorThrowable;
import rx.functions.Func1;
public final class QueryToListOperator<T> implements Observable.Operator<List<T>, SqlBrite.Query> {
final Func1<Cursor, T> mapper;
public QueryToListOperator(Func1<Cursor, T> mapper) {
this.mapper = mapper;
}
@Override
public Subscriber<? super SqlBrite.Query> call(final Subscriber<? super List<T>> subscriber) {
return new Subscriber<SqlBrite.Query>(subscriber) {
@Override
public void onNext(SqlBrite.Query query) {
try {
Cursor cursor = query.run();
if (cursor == null) {
return;
}
List<T> items = new ArrayList<>(cursor.getCount());
try {
for (int i = 1; cursor.moveToNext() && !subscriber.isUnsubscribed(); i++) {
T item = mapper.call(cursor);
if (item == null) {
throw new NullPointerException("Mapper returned null for row " + i);
}
items.add(item);
}
} finally {
cursor.close();
}
if (!subscriber.isUnsubscribed()) {
subscriber.onNext(items);
}
} catch (Throwable e) {
Exceptions.throwIfFatal(e);
onError(OnErrorThrowable.addValueAsLastCause(e, query.toString()));
}
}
@Override
public void onCompleted() {
subscriber.onCompleted();
}
@Override
public void onError(Throwable e) {
subscriber.onError(e);
}
};
}
}