package com.shizhefei.task.tasks;
import com.shizhefei.mvc.IAsyncDataSource;
import com.shizhefei.mvc.IDataSource;
import com.shizhefei.task.IAsyncTask;
import com.shizhefei.task.ITask;
import com.shizhefei.task.function.Func1;
import com.shizhefei.task.function.Func2;
/**
* Created by luckyjayce on 2017/4/16.
*/
public class Tasks {
/**
* 将一个同步task转化为异步task
* @param task
* @param <DATA>
* @return
*/
public static <DATA> LinkTask<DATA> async(ITask<DATA> task) {
return new AsyncLinkTask<>(task, true);
}
public static <DATA> LinkTask<DATA> just(DATA data) {
return new DataLinkTask<>(data);
}
/**
* 通过同步task创建一个链式task
* @param task
* @param <DATA>
* @return 一个链式task
*/
public static <DATA> LinkTask<DATA> create(ITask<DATA> task) {
return new AsyncLinkTask<>(task, true);
}
/**
* 通过异步task创建一个链式task
* @param task
* @param <DATA>
* @return 一个链式task
*/
public static <DATA> LinkTask<DATA> create(IAsyncTask<DATA> task) {
if (task instanceof LinkTask) {
return (LinkTask<DATA>) task;
}
return new LinkProxyTask<>(task);
}
/**
* 通过一个同步dataSource创建一个链式task
* @param dataSource
* @param isExeRefresh true:dataSource的refresh转成task,false:dataSource的loadMore转成task
* @param <DATA>
* @return 一个链式task
*/
public static <DATA> LinkTask<DATA> create(IDataSource<DATA> dataSource, boolean isExeRefresh) {
return new AsyncLinkTask<>(dataSource, isExeRefresh);
}
/**
* 通过一个异步dataSource创建一个链式task
* @param dataSource
* @param isExeRefresh true:dataSource的refresh转成task,false:dataSource的loadMore转成task
* @param <DATA>
* @return 一个链式task
*/
public static <DATA> LinkTask<DATA> create(IAsyncDataSource<DATA> dataSource, boolean isExeRefresh) {
return new AsyncLinkTask<>(dataSource, isExeRefresh);
}
/**
* 按两个task先后顺序执行,task1的结果可以作为task的参数
* @param task task1
* @param func 将task的结果传给task2,返回一个可执行task2
* @param <D> 数据1
* @param <DATA> 结果数据
* @return
*/
public static <D, DATA> LinkTask<DATA> concatMap(IAsyncTask<D> task, Func1<D, IAsyncTask<DATA>> func) {
return new ConcatLinkTask<>(task, func);
}
/**
* 按两个task先后顺序执行
*
* @param task
* @param task2
* @param <D>
* @param <DATA>
* @return
*/
public static <D, DATA> LinkTask<DATA> concatWith(IAsyncTask<D> task, final IAsyncTask<DATA> task2) {
return new ConcatLinkTask<>(task, new Func1<D, IAsyncTask<DATA>>() {
@Override
public IAsyncTask<DATA> call(D data) throws Exception {
return task2;
}
});
}
/**
* 合并两个task,两个task一起执行,其中一个报错就停止执行,func将两个d1和d2的结果转化成最终的data
* @param task1
* @param task2
* @param func
* @param <D1>
* @param <D2>
* @param <DATA>
* @return
*/
public static <D1, D2, DATA> LinkTask<DATA> combine(IAsyncTask<D1> task1, IAsyncTask<D2> task2, Func2<D1, D2, DATA> func) {
return new CombineTask<>(task1, task2, func);
}
}