auto ratios = []{ return fib() >> scan(1, [](auto prev, auto next){ return next / prev; }); }; int main() { auto fiveFibs = fib() >> take(5); // 0, 1, 1, 2, 3 auto ratiosTenToTwenty = ratios() >> drop(1) >> take(3); // 1/1, 2/1, 3/2 auto ratiosWithPrecission = ratios() >> zipWith( []{ return ratios() >> drop(1); }, [](auto prev, auto next) { return tuple{next, next - prev} ; }) >> takeWhile([](auto x){ return abs(get<1>(x)) < 0.0001 }); for (auto [ratio, delta]: ratiosWithPreccision) { cout << ratio << " " << delta << endl; } }