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