Example #1
0
        public static Task <TR> SelectMany <TI, TC, TR>(this Task <TI> task, Func <TI, Task <TC> > selector, Func <TI, TC, TR> projector)
        {
            var taskSource = new TaskCompletionSource <TR>();

            taskSource.SetResultFromTask(task, (ts, taskResult) => ts.SetResultFromTaskSafe(() => selector(taskResult), (ts_, selectorResult) => ts_.SetResultSafe(() => projector(taskResult, selectorResult))));
            return(taskSource.Task);
        }
Example #2
0
        public static Task <TR> Select <TI, TR>(this Task <TI> task, Func <TI, TR> selector)
        {
            var taskSource = new TaskCompletionSource <TR>();

            taskSource.SetResultFromTask(task, (ts, taskResult) => ts.SetResultSafe(() => selector(taskResult)));
            return(taskSource.Task);
        }
Example #3
0
        public static void SetResultFromTaskSafe <TI, TR>(this TaskCompletionSource <TR> taskSource, Func <Task <TI> > getTask, Action <TaskCompletionSource <TR>, TI> setResultAction)
        {
            Task <TI> task;

            try {
                task = getTask();
            } catch (Exception e) {
                taskSource.SetException(e);
                return;
            }
            taskSource.SetResultFromTask(task, setResultAction);
        }
Example #4
0
        public static Task <T> Where <T>(this Task <T> task, Func <T, bool> predicate)
        {
            var taskSource = new TaskCompletionSource <T>();

            taskSource.SetResultFromTask(task, (ts, taskResult) => {
                ts.SetResultSafe(() => predicate(taskResult), (ts_, predicateResult) => {
                    if (predicateResult)
                    {
                        ts_.SetResult(taskResult);
                    }
                    else
                    {
                        ts_.SetCanceled();
                    }
                });
            });
            return(taskSource.Task);
        }
Example #5
0
 public static void SetResultFromTask <T>(this TaskCompletionSource <T> taskSource, Task <T> task)
 {
     taskSource.SetResultFromTask(task, (ts, taskResult) => ts.SetResult(taskResult));
 }
 public static void SetResultFromTask <TI, TR>(this TaskCompletionSource <TR> taskSource, Task <TI> task, Action <TaskCompletionSource <TR>, TI> setResultAction)
 {
     taskSource.SetResultFromTask(task, setResultAction, x => x.SetCanceled());
 }