#pragma once #include "util/utility.h" template struct overloaded : Ts... { using Ts::operator()...; }; template overloaded(Ts...) -> overloaded; template auto partial(Func func, BoundArgs... bound_args) { return [func, bound_args...](auto&&... call_args) { return func(bound_args..., forward(call_args)...); }; } template auto construct() { return [](auto&&... args) { return Type{forward(args)...}; }; }