This documentation is automatically generated by online-judge-tools/verification-helper
#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
*/