@@ -101,6 +101,8 @@ class any {
101101 class closure {
102102 public:
103103 virtual auto operator()(const any&) const -> any = 0;
104+ virtual auto operator()(const any&, const any&) const -> any = 0;
105+ virtual auto operator()(const any&, const any&, const any&) const -> any = 0;
104106 };
105107
106108 template <typename T>
@@ -111,6 +113,52 @@ class any {
111113 auto operator()(const any& arg) const -> any {
112114 return lambda(arg);
113115 }
116+ auto operator()(const any& arg1, const any& arg2) const -> any {
117+ return lambda(arg1)(arg2);
118+ }
119+ auto operator()(const any& arg1, const any& arg2, const any& arg3) const -> any {
120+ return lambda(arg1)(arg2)(arg3);
121+ }
122+ };
123+
124+ template <typename T>
125+ class _closure2 : public closure {
126+ const T lambda;
127+ public:
128+ _closure2(const T& l) noexcept : lambda(l) {}
129+ auto operator()(const any& arg1) const -> any {
130+ return [=](const any& arg2) -> any {
131+ return lambda(arg1, arg2);
132+ };
133+ }
134+ auto operator()(const any& arg1, const any& arg2) const -> any {
135+ return lambda(arg1, arg2);
136+ }
137+ auto operator()(const any& arg1, const any& arg2, const any& arg3) const -> any {
138+ return lambda(arg1, arg2)(arg3);
139+ }
140+ };
141+
142+ template <typename T>
143+ class _closure3 : public closure {
144+ const T lambda;
145+ public:
146+ _closure3(const T& l) noexcept : lambda(l) {}
147+ auto operator()(const any& arg1) const -> any {
148+ return [=](const any& arg2) -> any {
149+ return [=](const any& arg3) -> any {
150+ return lambda(arg1, arg2, arg3);
151+ };
152+ };
153+ }
154+ auto operator()(const any& arg1, const any& arg2) const -> any {
155+ return [=](const any& arg3) -> any {
156+ return lambda(arg1, arg2, arg3);
157+ };
158+ }
159+ auto operator()(const any& arg1, const any& arg2, const any& arg3) const -> any {
160+ return lambda(arg1, arg2, arg3);
161+ }
114162 };
115163
116164 class eff_fn {
@@ -194,6 +242,19 @@ class any {
194242 any(const T& val, typename std::enable_if<std::is_assignable<std::function<any(const any&)>,T>::value>::type* = 0)
195243 : type(Type::Closure), l(make_shared<_closure<T>>(val)) {}
196244
245+ template <typename T, typename = typename std::enable_if<!std::is_same<any,T>::value &&
246+ !std::is_convertible<T,fn>::value>::type>
247+ any(const T& val, typename std::enable_if<std::is_assignable<std::function<any(const any&,
248+ const any&)>,T>::value>::type* = 0)
249+ : type(Type::Closure), l(make_shared<_closure2<T>>(val)) {}
250+
251+ template <typename T, typename = typename std::enable_if<!std::is_same<any,T>::value &&
252+ !std::is_convertible<T,fn>::value>::type>
253+ any(const T& val, typename std::enable_if<std::is_assignable<std::function<any(const any&,
254+ const any&,
255+ const any&)>,T>::value>::type* = 0)
256+ : type(Type::Closure), l(make_shared<_closure3<T>>(val)) {}
257+
197258 template <typename T>
198259 any(const T& val, typename std::enable_if<std::is_assignable<std::function<any()>,T>::value>::type* = 0)
199260 : type(Type::EffFunction), e(make_shared<_eff_fn<T>>(val)) {}
@@ -252,6 +313,8 @@ class any {
252313 }
253314
254315 auto operator()(const any&) const -> any;
316+ auto operator()(const any&, const any&) const -> any;
317+ auto operator()(const any&, const any&, const any&) const -> any;
255318
256319 auto operator()(const as_thunk) const -> const any&;
257320