#pragma once #include #include #include namespace stream::detail { template class join_stream { public: using iter_type = ::iterator::joining_iterator>; using T = typename C::value_type; explicit join_stream(stream_base const & sb) : source_(sb) {} iterator begin() { return iter_type(source_); } iterator end() { return iter_type(); } private: stream_base source_; }; template stream_base make_join(stream_base const & sb) { return std::make_shared>(sb); } template template stream_base> stream_base::flatmap(F && func) && { return make_join(std::move(*this).map(func)); } template template stream_base> stream_base::flatmap(F && func) const & { return make_join(map(func)); } }