package com.getbase.android.db.loaders; import com.getbase.android.db.common.QueryData; import com.getbase.android.db.cursors.Cursors; import com.google.common.base.Function; import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.support.v4.content.Loader; import java.util.List; public class TransformedRowLoaderBuilder<T> { private final QueryData queryData; private final ImmutableList<Uri> notificationUris; private final Function<Cursor, T> cursorTransformation; public TransformedRowLoaderBuilder(QueryData queryData, ImmutableList<Uri> notificationUris, Function<Cursor, T> transformation) { this.queryData = queryData; this.notificationUris = notificationUris; this.cursorTransformation = transformation; } public <Out> TransformedRowLoaderBuilder<Out> transformRow(final Function<T, Out> rowTransformer) { return new TransformedRowLoaderBuilder<>(queryData, notificationUris, Functions.compose(rowTransformer, cursorTransformation)); } public TransformedLoaderBuilder<List<T>> lazy() { return new TransformedLoaderBuilder<>(queryData, notificationUris, getLazyTransformationFunction()); } public <Out> TransformedLoaderBuilder<Out> transform(final Function<List<T>, Out> transformer) { return new TransformedLoaderBuilder<>(queryData, notificationUris, Functions.compose(transformer, getEagerTransformationFunction()) ); } public TransformedRowLoaderBuilder<T> addNotificationUri(Uri uri) { return new TransformedRowLoaderBuilder<>(queryData, ImmutableList.<Uri>builder().addAll(notificationUris).add(uri).build(), cursorTransformation); } public Loader<List<T>> build(Context context) { return new ComposedCursorLoader<>(context, queryData, ImmutableList.copyOf(notificationUris), getEagerTransformationFunction()); } private Function<Cursor, List<T>> getEagerTransformationFunction() { return new Function<Cursor, List<T>>() { @Override public List<T> apply(Cursor input) { return Lists.newArrayList(Cursors.toFluentIterable(input, cursorTransformation)); } }; } private Function<Cursor, List<T>> getLazyTransformationFunction() { return new Function<Cursor, List<T>>() { @Override public List<T> apply(Cursor cursor) { return new LazyCursorList<>(cursor, cursorTransformation); } }; } }