# QtPromise::reduce
Since: 0.5.0
QPromise::reduce(Sequence<T|QPromise<T>> values, Reducer reducer) -> QPromise<T>
QPromise::reduce(Sequence<T|QPromise<T>> values, Reducer reducer, R|QPromise<R> initialValue) -> QPromise<R>
// With:
// - Sequence: STL compatible container (e.g. QVector, etc.)
// - Reducer: Function(T|R accumulator, T item, int index) -> R|QPromise<R>
Iterates over values and reduces the sequence to a single value (opens new window)
using the given reducer function and an optional initialValue. The type returned by reducer
determines the type of the output promise. If reducer throws, output is rejected with the
new exception.
If reducer returns a promise (or QFuture), then the result of the promise is awaited, before
continuing with next iteration. If any promise in the values sequence is rejected or a promise
returned by the reducer function is rejected, output immediately rejects with the error of
the promise that rejected.
// Concatenate the content of the given files, read asynchronously
auto output = QtPromise::reduce(QList<QUrl>{
"file:f0.txt", // contains "foo"
"file:f1.txt", // contains "bar"
"file:f2.txt" // contains "42"
}, [](const QString& acc, const QString& cur, int idx) {
return readAsync(cur).then([=](const QString& res) {
return QString{"%1;%2:%3"}.arg(acc).arg(idx).arg(res);
});
}, QString{"index:text"});
// 'output' resolves as soon as all promises returned by
// 'reducer' are fulfilled or at least one is rejected.
// 'output' type: QPromise<QString>
output.then([](const QString& res) {
// res == "index:text;0:foo;1:bar;2:42"
// {...}
});
IMPORTANT
The first time reducer is called, if no initialValue is provided, accumulator will be equal
to the first value in the sequence, and currentValue to the second one (thus index will be 1).
See also: QPromise<T>::reduce