inline static bool SSVU_ATTRIBUTE(pure) areArrItemsOfType(const Val& mV) noexcept { SSVU_ASSERT(mV.is<Arr>()); for(const auto& v : mV.getArr()) if(!v.template isNoNum<T>()) return false; return true; }
inline static EnableIf < TI<sizeof...(TArgs), bool> isTpl(const Val& mV) noexcept { SSVU_ASSERT(mV.is<Arr>() && mV.getArr().size() > TI); if(!mV[TI].isNoNum<TplArg<TI, Tpl<TArgs...>>>()) return false; return isTpl<TI + 1, TArgs...>(mV); }
template<typename T> inline static void toVal(Val& mVal, T&& mX) { mVal = Arr{}; for(auto& p : mX) mVal.getArr().emplace_back(moveIfRValue<decltype(mX)>(p)); }
inline static auto is(const Val& mV) noexcept { return mV.getType() == Val::Type::Arr && mV.getArr().size() == TS && TplIsHelper::areArrItemsOfType<TItem>(mV); }
inline static auto is(const Val& mV) noexcept { return mV.getType() == Val::Type::Arr && mV.getArr().size() == sizeof...(TArgs) && TplIsHelper::isTpl<0, TArgs...>(mV); }
inline static auto is(const Val& mV) noexcept { return mV.getType() == Val::Type::Arr && mV.getArr().size() == 2 && mV[0].isNoNum<T1>() && mV[1].isNoNum<T2>(); }