#pragma once #include "utils/iterator/wrap.hpp" #include "utils/option.hpp" namespace iter { template class OneTimeAccessor { public: OneTimeAccessor() : it(Option>()) {} OneTimeAccessor(I &&it) : it(Wrap(std::move(it))) {} Wrap begin() { return it.take(); } Wrap end() { return Wrap(); } private: Option> it; }; template auto make_one_time_accessor(I &&iter) { return OneTimeAccessor(std::move(iter)); } }