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;
  }
}