Advertisement
Guest User

Untitled

a guest
Dec 14th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <vector>
  4.  
  5. template<typename functor_t>
  6. struct map_functor_t
  7. {
  8.     template<typename Arg>
  9.     auto operator()(Arg arg) {
  10.         return func_(arg);
  11.     }
  12.  
  13.     functor_t func_;
  14. };
  15.  
  16. template<typename functor_t>
  17. map_functor_t<functor_t> map(functor_t transformer)
  18. {
  19.     return map_functor_t<functor_t>{transformer};
  20. }
  21.  
  22. //=========================================================
  23.  
  24. template<typename elem_t>
  25. struct stream_t {
  26.     std::vector<elem_t> elems_;
  27. };
  28.  
  29. template<typename elem_t>
  30. stream_t<elem_t> make_stream(const std::vector<elem_t>& elems)
  31. {
  32.     return stream_t<elem_t>{elems};
  33. }
  34.  
  35. template<typename elem_t>
  36. stream_t<elem_t> make_stream(const std::initializer_list<elem_t>& elems)
  37. {
  38.     return stream_t<elem_t>{elems};
  39. }
  40.  
  41. //=========================================================
  42.  
  43. template<typename elem_t, typename function_t>
  44. auto operator|(const stream_t<elem_t>& stream, function_t fn)
  45. {
  46.     using result_t = typename std::result_of<function_t(elem_t)>::type;
  47.  
  48.     stream_t<result_t> result;
  49.     for (const auto& elem: stream.elems_) {
  50.         result.elems_.push_back(fn(elem));
  51.     }
  52.     return result;
  53. }
  54.  
  55. // ========================================================
  56.  
  57. struct summator_t {};
  58.  
  59. summator_t sum() { return summator_t(); }
  60.  
  61. template<typename elem_t>
  62. auto operator|(const stream_t<elem_t>& stream, summator_t)
  63. {
  64.     if (stream.elems_.empty()) {
  65.         return elem_t();
  66.     }
  67.  
  68.     auto e = stream.elems_.front();
  69.     for (size_t i = 1; i < stream.elems_.size(); ++i) {
  70.         e += stream.elems_[i];
  71.     }
  72.     return e;
  73. }
  74.  
  75. int main() {
  76.     std::cout << (make_stream({1, 2, 3})
  77.                 | map([] (int x) { return x * x; })
  78.                 | map([] (int x) { return x + 1; })
  79.                 | sum()) << std::endl;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement