namespace internal {
// structs
template <typename C, typename T>
struct case_wrapper;
// global functions
template <typename T, typename C>
case_wrapper<C, T> make_case_wrapper(C&& val);
template <template<typename...> class Fn, typename Ctx, typename T, typename Case>
bool match(
Ctx&& ctx,
T&& val,
Case&& cs
);
template <
template<typename...> class Fn,
typename Ctx,
typename T,
typename Case,
typename... Cases
>
bool match(
Ctx&& ctx,
T&& val,
Case&& cs,
Cases&&... cases
);
} // namespace internal