Skip to content

Instantly share code, notes, and snippets.

@dlentini
Created July 31, 2018 05:25
Show Gist options
  • Save dlentini/06ac6169fd236f091d3917fcc88566b4 to your computer and use it in GitHub Desktop.
Save dlentini/06ac6169fd236f091d3917fcc88566b4 to your computer and use it in GitHub Desktop.
Example of piping functions
#include <cassert>
namespace lab {
class result {
bool success = false;
int value = 0;
public:
result() = default;
result(int x) : success(true), value(x) {}
operator bool() const { return success; }
int operator*() const { return value; }
};
template<typename A, typename B>
auto operator|(A a, B b) {
if (a) return b(*a);
return a;
}
} // namespace lab
auto a(int x) { return lab::result(x+1); }
auto b(int x) { return lab::result(x*x); }
auto c(int x) {
// return result(); // make it fail
return lab::result(x-1);
}
auto d(int x) {
// assert(false); // check that d don't run
return lab::result(x+10);
}
int main(void)
{
const auto r = a(1) | b | c | d;
assert(r);
assert(*r == 13);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment