Guest User

Untitled

a guest
May 27th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // abstract base class for a continuation functor
  4. struct continuation {
  5. virtual void operator() (unsigned) const = 0;
  6. };
  7.  
  8. // accumulating continuation functor
  9. struct accum_cont: public continuation {
  10. private:
  11. unsigned accumulator_;
  12. const continuation &enclosing_;
  13. public:
  14. accum_cont(unsigned accumulator, const continuation &enclosing)
  15. : accumulator_(accumulator), enclosing_(enclosing) {};
  16. virtual void operator() (unsigned n) const {
  17. enclosing_(accumulator_ * n);
  18. };
  19. };
  20.  
  21. void fact_cps (unsigned n, const continuation &c)
  22. {
  23. if (n == 0)
  24. c(1);
  25. else
  26. fact_cps(n - 1, accum_cont(n, c));
  27. }
  28.  
  29. int main ()
  30. {
  31. // continuation which displays its' argument when called
  32. struct disp_cont: public continuation {
  33. virtual void operator() (unsigned n) const {
  34. std::cout << n << std::endl;
  35. };
  36. } dc;
  37.  
  38. // continuation which multiplies its' argument by 2
  39. // and displays it when called
  40. struct mult_cont: public continuation {
  41. virtual void operator() (unsigned n) const {
  42. std::cout << n * 2 << std::endl;
  43. };
  44. } mc;
  45.  
  46. fact_cps(4, dc); // prints 24
  47. fact_cps(5, mc); // prints 240
  48.  
  49. return 0;
  50. }
  51.  
  52. const AmberTask tickOneAmberHour = [](const amber::Amber& amber)
  53. {
  54. auto action1Res = magic::anyway(inflateShadowStorms, magic::wrap(amber));
  55. auto action2Res = magic::anyway(affectShadowStorms, action1Res);
  56. auto action3Res = magic::onFail(shadowStabilization, action2Res);
  57. auto action4Res = magic::anyway(tickWorldTime, action3Res);
  58. return action4Res.amber;
  59. };
  60.  
  61. Car car1 = {"x555xx", "Ford Focus", 0, {}};
  62. Car car2 = {"y555yy", "Toyota Corolla", 10000, {}};
  63.  
  64. std::vector<Car> cars = {car1, car2};
  65.  
  66. auto zoomer = traversed<Car>() to modelL();
  67.  
  68. std::function<std::string(std::string)> variator = [](std::string) { return std::string("BMW x6"); };
  69. std::vector<Car> result = over(zoomer, cars, variator);
  70.  
  71. QVERIFY(result.size() == 2);
  72. QVERIFY(result[0].model == "BMW x6");
  73. QVERIFY(result[1].model == "BMW x6");
  74.  
  75. template <typename A, typename B>
  76. UUB fmap(
  77. const func<B(UUA)>& f,
  78. const UUUUA& uuu)
  79. {
  80. const func<UB(UUUA)> f2 = [=](const UUUA& uuu2)
  81. {
  82. UB newUt;
  83. newUt.position = uuu2.position;
  84. newUt.field = fp::map(f, uuu2.field);
  85. return newUt;
  86. };
  87.  
  88. return { fp::map(f2, uuu.field), uuu.position };
  89. }
  90.  
  91. STML<Unit> takeFork(const TFork& tFork) {
  92. return withTVar<Fork, Unit>(tFork, [=](const Fork& fork) {
  93. if (fork.state == ForkState::Free) {
  94. return writeTVar<Fork>(tFork, Fork {fork.name, ForkState:Taken});
  95. }
  96. else {
  97. return retry<Unit>();
  98. }
  99. });
  100. }
  101.  
  102. STML<Unit> takeForks(const TForkPair& forks) {
  103. STML<Unit> lm = takeFork(forks.left);
  104. STML<Unit> rm = takeFork(forks.right);
  105. return sequence(lm, rm);
  106. }
Add Comment
Please, Sign In to add comment