This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub noshi91/Library
#include <functional> #include <memory> #include <utility> #include <variant> template <class T> class suspension : private std::shared_ptr<std::variant<T, std::function<T()>>> { public: using value_type = T; using func_type = std::function<T()>; using node_type = std::variant<T, func_type>; private: using base_type = std::shared_ptr<node_type>; static T get(node_type &x) { if (x.index() != 0) x = std::get<1>(x)(); return std::get<0>(x); } template <class... Args> static base_type make_node(Args &&... args) { return std::make_shared<node_type>(std::forward<Args>(args)...); } public: suspension(std::in_place_t, T x) : base_type(make_node(std::in_place_index<0>, x)) {} suspension(func_type f) : base_type(make_node(std::in_place_index<1>, f)) {} T force() const { return get(**this); } }; /** * @brief Suspension * @see https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf */
#line 1 "other/suspension.cpp" #include <functional> #include <memory> #include <utility> #include <variant> template <class T> class suspension : private std::shared_ptr<std::variant<T, std::function<T()>>> { public: using value_type = T; using func_type = std::function<T()>; using node_type = std::variant<T, func_type>; private: using base_type = std::shared_ptr<node_type>; static T get(node_type &x) { if (x.index() != 0) x = std::get<1>(x)(); return std::get<0>(x); } template <class... Args> static base_type make_node(Args &&... args) { return std::make_shared<node_type>(std::forward<Args>(args)...); } public: suspension(std::in_place_t, T x) : base_type(make_node(std::in_place_index<0>, x)) {} suspension(func_type f) : base_type(make_node(std::in_place_index<1>, f)) {} T force() const { return get(**this); } }; /** * @brief Suspension * @see https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf */