#ifndef SMO_MARIONETTE_THREAD_H
#define SMO_MARIONETTE_THREAD_H

#include <boost/asio/io_context.hpp>
#include <spinscale/co/invokers.h>
#include <spinscale/co/postingPromise.h>

namespace smo {
namespace mrntt {

struct MrnttThreadTag
{
	static boost::asio::io_context &io_context() noexcept;
};

template <typename T>
using MrnttPostingPromise =
	sscl::co::TaggedPostingPromise<T, MrnttThreadTag>;

using MrnttNonViralPostingInvoker =
	sscl::co::NonViralPostingInvoker<MrnttPostingPromise>;

using MrnttNonViralNonPostingInvoker =
	sscl::co::NonViralNonPostingInvoker;

template <typename T>
using MrnttViralPostingInvoker =
	sscl::co::ViralPostingInvoker<MrnttPostingPromise, T>;

using MrnttViralNonPostingInvoker =
	sscl::co::ViralNonPostingInvoker<void>;

template <typename T>
using MrnttViralNonPostingInvokerT =
	sscl::co::ViralNonPostingInvoker<T>;

} // namespace mrntt
} // namespace smo

#endif // SMO_MARIONETTE_THREAD_H
