public static Task <TResult> SelectOptionalAsync <TItem, TSelect, TCarry1, TCarry2, TResult>(this IEnumerableAsync <TItem> enumerable, TCarry1 carry1, TCarry2 carry2, Func <TItem, TCarry1, TCarry2, Func <TSelect, TCarry1, TCarry2, ISelectionResult <TSelect> >, Func <TCarry1, TCarry2, ISelectionResult <TSelect> >, Task <ISelectionResult <TSelect> > > selectionAsync, Func <TSelect[], TCarry1, TCarry2, TResult> aggregation) { return(enumerable.SelectOptionalAsync(carry1.PairWithValue(carry2), (item, carryUpdated, next, skip) => selectionAsync(item, carryUpdated.Key, carryUpdated.Value, (selected, carry1Updated, carry2Updated) => next(selected, carry1Updated.PairWithValue(carry2Updated)), (carry1Updated, carry2Updated) => skip(carry1Updated.PairWithValue(carry2Updated))), (TSelect[] selectedItems, KeyValuePair <TCarry1, TCarry2> carryFinal) => aggregation(selectedItems, carryFinal.Key, carryFinal.Value))); }