join.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. mem_ = *(++start_);
  50. curr_ = mem_.begin();
  51. end_ = mem_.end();
  52. }
  53. }
  54. ::stream::iterator<C> start_, finish_;
  55. C mem_;
  56. typename C::iterator curr_, end_;
  57. };
  58. explicit join_stream(stream_base<C, B> const& sb) : source_(sb) {}
  59. explicit join_stream(stream_base<C, B> && sb) : source_(std::forward<stream_base<C, B>>(sb)) { }
  60. ~join_stream() override {}
  61. ::stream::iterator<T> begin() override {
  62. return new iterator{source_.begin(), source_.end()};
  63. }
  64. ::stream::iterator<T> end() override {
  65. return new iterator{source_.end(), source_.end()};
  66. }
  67. private:
  68. stream_base<C, B> source_;
  69. };
  70. template <typename C, bool Own>
  71. auto join(stream_base<C, Own> const& sb) -> stream_base<typename C::value_type, true> {
  72. using T = typename C::value_type;
  73. using impl_t = join_stream<C, false>;
  74. return stream_base<T, true>{new impl_t{falsify(sb)}};
  75. }
  76. template <typename C, bool Own>
  77. auto join(stream_base<C, Own> && sb) -> stream_base<typename C::value_type, true> {
  78. using T = typename C::value_type;
  79. using impl_t = join_stream<C, Own>;
  80. return stream_base<T, true>{new impl_t(std::forward<stream_base<C, Own>>(sb))};
  81. }
  82. template <typename T, bool Own>
  83. template <typename F>
  84. auto stream_base<T, Own>::flatmap(F&& func) const& -> stream_base<flatmap_f<F>, true> {
  85. return join((*this).map(func));
  86. }
  87. template <typename T, bool Own>
  88. template <typename F>
  89. auto stream_base<T, Own>::flatmap(F&& func) && -> stream_base<flatmap_f<F>, true> {
  90. return join(std::forward<self>(*this).map(func));
  91. }
  92. }
  93. }