// // accumulate.h // stream // // Created by Sam Jaffe on 3/29/23. // #pragma once #include #include #include #define FWD(x) std::forward(x) namespace stream::ranges { template auto fold_left(It it, S end, T init, F reduce) { for (; it != end; ++it) { init = std::invoke(reduce, init, *it); } return init; } template auto fold_left(Stream && stream, T init, F reduce) { for (auto && elem : FWD(stream)) { init = std::invoke(reduce, init, FWD(elem)); } return init; } template auto fold_left_with_first(Stream && stream, F reduce) { return fold_left(++stream.begin(), stream.end(), *stream.begin(), std::move(reduce)); } } #undef FWD