Advertisement
Guest User

Untitled

a guest
Jun 21st, 2019
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <vector>
  4. #include <tuple>
  5.  
  6. template<class... Types>
  7. class Monad
  8. {
  9. public:
  10. Monad(std::tuple<Types...> t) : params(t){}
  11. template<class F, class... Us>
  12. auto operator>=(F func)
  13. {
  14. auto t = std::tuple_cat(params, std::make_tuple(func));
  15. return make_monad(t);
  16. }
  17. auto run()
  18. {
  19. return call_func(std::index_sequence_for<Types...>{});
  20. }
  21. private:
  22. std::tuple<Types...> params;
  23.  
  24. template<std::size_t... I>
  25. auto call_func(std::index_sequence<I...>)
  26. {
  27. return run_impl(std::get<I>(params)...);
  28. }
  29. template<class X>
  30. X run_impl(X x)
  31. {
  32. std::cout << x << std::endl;
  33. return x;
  34. }
  35. template<class X, class F, class... Args>
  36. auto run_impl(X x, F f, Args... args)
  37. {
  38. std::cout << x << " >= ";
  39. return run_impl(f(x), args...);
  40. }
  41. };
  42.  
  43. template<class... Args>
  44. Monad<Args...> make_monad(std::tuple<Args...> t)
  45. {
  46. return Monad<Args...>(t);
  47. }
  48.  
  49. struct F1
  50. {
  51. double operator()(int a)
  52. {
  53. return a+0.1;
  54. }
  55. };
  56.  
  57.  
  58.  
  59. struct Mult2
  60. {
  61. std::size_t operator()(double d)
  62. {
  63. return d*2;
  64. }
  65. };
  66.  
  67.  
  68. int main()
  69. {
  70. Monad<int> m(5);
  71. auto i = m >= F1() >= Mult2() >= [](std::size_t x){return x+20;};
  72.  
  73. std::cout << i.run() << std::endl;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement