join.hpp 967 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #pragma once
  2. #include <iterator>
  3. #include <iterator/join_iterator.hpp>
  4. #include <stream/iterator.hpp>
  5. namespace stream::detail {
  6. template <typename C> class join_stream {
  7. public:
  8. using iter_type = ::iterator::joining_iterator<iterator<C>>;
  9. using T = typename C::value_type;
  10. explicit join_stream(stream_base<C> const & sb) : source_(sb) {}
  11. iterator<T> begin() { return iter_type(source_); }
  12. iterator<T> end() { return iter_type(); }
  13. private:
  14. stream_base<C> source_;
  15. };
  16. template <typename C>
  17. stream_base<typename C::value_type> make_join(stream_base<C> const & sb) {
  18. return std::make_shared<join_stream<C>>(sb);
  19. }
  20. template <typename T>
  21. template <typename F>
  22. stream_base<traits::fmapped_t<T, F>> stream_base<T>::flatmap(F && func) && {
  23. return make_join(std::move(*this).map(func));
  24. }
  25. template <typename T>
  26. template <typename F>
  27. stream_base<traits::fmapped_t<T, F>>
  28. stream_base<T>::flatmap(F && func) const & {
  29. return make_join(map(func));
  30. }
  31. }