join.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #pragma once
  2. template <typename T, typename C, bool B>
  3. stream::detail::stream_base<typename C::value_type, true> operator|(stream::detail::stream_base<T, B> const&s, stream::flatmap_t<T, C>&& f) {
  4. return s.flatmap(f.func);
  5. }
  6. template <typename T, typename C, bool B>
  7. stream::detail::stream_base<typename C::value_type, true> operator|(stream::detail::stream_base<T, B> &&s, stream::flatmap_t<T, C>&& f) {
  8. return std::move(s).flatmap(f.func);
  9. }
  10. namespace stream {
  11. template <typename T, typename R>
  12. struct flatmap_t {
  13. template <typename F>
  14. explicit flatmap_t(F&& f) : func(f) {}
  15. std::function<R(const T&)> func;
  16. };
  17. }
  18. namespace stream {
  19. namespace detail {
  20. template <typename C, bool B>
  21. class join_stream : public stream_impl<typename C::value_type> {
  22. public:
  23. using T = typename C::value_type;
  24. class iterator : public iterator_impl<T> {
  25. public:
  26. typedef iterator_impl<T> super;
  27. iterator(::stream::iterator<C>&& f, ::stream::iterator<C>&& l)
  28. : start_(std::forward<::stream::iterator<C>>(f))
  29. , finish_(std::forward<::stream::iterator<C>>(l))
  30. {
  31. if (start_ != finish_) {
  32. mem_ = *(start_);
  33. curr_ = mem_.begin();
  34. end_ = mem_.end();
  35. advance();
  36. }
  37. }
  38. ~iterator() {}
  39. T operator*() override { return *curr_; }
  40. super& operator++() override {
  41. ++curr_;
  42. advance();
  43. return *this;
  44. }
  45. DELEGATE_ITERATOR_IMPL_BASE(start_)
  46. private:
  47. void advance() {
  48. while (curr_ == end_ && start_ != finish_) {
  49. if ( ++start_ == finish_ ) { break; }
  50. mem_ = *start_;
  51. curr_ = mem_.begin();
  52. end_ = mem_.end();
  53. }
  54. }
  55. ::stream::iterator<C> start_, finish_;
  56. C mem_;
  57. typename C::iterator curr_, end_;
  58. };
  59. explicit join_stream(stream_base<C, B> const& sb) : source_(sb) {}
  60. explicit join_stream(stream_base<C, B> && sb) : source_(std::forward<stream_base<C, B>>(sb)) { }
  61. ~join_stream() override {}
  62. ::stream::iterator<T> begin() override {
  63. return ::stream::iterator<T>{new iterator{source_.begin(), source_.end()}};
  64. }
  65. ::stream::iterator<T> end() override {
  66. return ::stream::iterator<T>{new iterator{source_.end(), source_.end()}};
  67. }
  68. private:
  69. stream_base<C, B> source_;
  70. };
  71. template <typename C, bool Own>
  72. auto join(stream_base<C, Own> const& sb) -> stream_base<typename C::value_type, true> {
  73. using T = typename C::value_type;
  74. using impl_t = join_stream<C, false>;
  75. return stream_base<T, true>{new impl_t{falsify(sb)}};
  76. }
  77. template <typename C, bool Own>
  78. auto join(stream_base<C, Own> && sb) -> stream_base<typename C::value_type, true> {
  79. using T = typename C::value_type;
  80. using impl_t = join_stream<C, Own>;
  81. return stream_base<T, true>{new impl_t(std::forward<stream_base<C, Own>>(sb))};
  82. }
  83. template <typename T, bool Own>
  84. template <typename F>
  85. auto stream_base<T, Own>::flatmap(F&& func) const& -> stream_base<flatmap_f<F>, true> {
  86. return join((*this)).map(func);
  87. }
  88. template <typename T, bool Own>
  89. template <typename F>
  90. auto stream_base<T, Own>::flatmap(F&& func) && -> stream_base<flatmap_f<F>, true> {
  91. return join(std::forward<self>(*this)).map(func);
  92. }
  93. }
  94. }