#pragma once #include "utils/iterator/iterator_base.hpp" namespace iter { // Wraps lambda into interator with next(). // T - type of return value // F - type of wraped lambda template class LambdaIterator : public IteratorBase { public: LambdaIterator(F &&f) : func(std::move(f)) {} Option next() final { return func(); } private: F func; }; // Wraps lambda which returns options as an iterator. template auto make_iterator(F &&f) { // Because function isn't receving or in any way using type T from // FunctionIterator compiler can't deduce it thats way there is decltype in // construction of FunctionIterator. Resoulting type of iter.next().take() // is T. return LambdaIterator(std::move(f)); } }