#include <iostream>
namespace operators
{
template <class Fun>
struct composer
{
Fun fun;
};
struct compose_t {} compose;
template <class Fun>
composer<Fun> operator < (Fun fun, compose_t) { return {fun}; }
template <class Fun1, class Fun2>
decltype(auto) operator > (composer<Fun1> comp1, Fun2 fun2) {
return [=](auto... v) {
return fun2(comp1.fun(std::forward<decltype(v)>(v)...));
};
}
}
struct filter {
float operator()(float v) { return v; }
};
struct envelope {
void set_slider1(float v) {}
void set_slider2(float v) {}
void set_slider3(float v) {}
};
int main() {
using namespace operators;
auto composed = [](float v) { return v * 2; } <compose>
[](float v) { return v / 2; } <compose>
[](float v) { return v * v; };
std::cout << composed(10.f) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIG9wZXJhdG9ycwp7Cgl0ZW1wbGF0ZSA8Y2xhc3MgRnVuPgoJc3RydWN0IGNvbXBvc2VyCgl7CgkJRnVuIGZ1bjsJCgl9OwoJCglzdHJ1Y3QgY29tcG9zZV90IHt9IGNvbXBvc2U7CgkKCXRlbXBsYXRlIDxjbGFzcyBGdW4+Cgljb21wb3NlcjxGdW4+IG9wZXJhdG9yIDwgKEZ1biBmdW4sIGNvbXBvc2VfdCkgeyByZXR1cm4ge2Z1bn07IH0KCQoJdGVtcGxhdGUgPGNsYXNzIEZ1bjEsIGNsYXNzIEZ1bjI+CglkZWNsdHlwZShhdXRvKSBvcGVyYXRvciA+IChjb21wb3NlcjxGdW4xPiBjb21wMSwgRnVuMiBmdW4yKSB7IAoJCXJldHVybiBbPV0oYXV0by4uLiB2KSB7IAoJCQlyZXR1cm4gZnVuMihjb21wMS5mdW4oc3RkOjpmb3J3YXJkPGRlY2x0eXBlKHYpPih2KS4uLikpOwoJCX07Cgl9Cn0KCnN0cnVjdCBmaWx0ZXIgewoJZmxvYXQgb3BlcmF0b3IoKShmbG9hdCB2KSB7IHJldHVybiB2OyB9Cn07CgpzdHJ1Y3QgZW52ZWxvcGUgewoJdm9pZCBzZXRfc2xpZGVyMShmbG9hdCB2KSB7fQoJdm9pZCBzZXRfc2xpZGVyMihmbG9hdCB2KSB7fQoJdm9pZCBzZXRfc2xpZGVyMyhmbG9hdCB2KSB7fQp9OwoKaW50IG1haW4oKSB7Cgl1c2luZyBuYW1lc3BhY2Ugb3BlcmF0b3JzOwoJCglhdXRvIGNvbXBvc2VkID0gW10oZmxvYXQgdikgeyByZXR1cm4gdiAqIDI7IH0gPGNvbXBvc2U+IAoJCQkJCVtdKGZsb2F0IHYpIHsgcmV0dXJuIHYgLyAyOyB9IDxjb21wb3NlPgoJCQkJCVtdKGZsb2F0IHYpIHsgcmV0dXJuIHYgKiB2OyB9OwoJCQkJCQoJc3RkOjpjb3V0IDw8IGNvbXBvc2VkKDEwLmYpIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9