fork download
  1. #include <cstdio>
  2.  
  3. template<class T>
  4. struct maybe
  5. {
  6. maybe( const T& t ) : argument( t ), valid( true ) {}
  7. maybe() : argument(), valid( false ) {}
  8.  
  9. T argument;
  10. bool valid;
  11. };
  12.  
  13. template<class T>
  14. maybe<T> just( const T& t ) { return maybe<T>(t); }
  15.  
  16. template<class T>
  17. maybe<T> nothing() { return maybe<T>(); }
  18.  
  19. auto terminal_maybe = [] ( auto term ) {
  20. return [=] ( auto func ) {
  21. return func( term );
  22. };
  23. };
  24.  
  25. auto fmap_maybe = [] ( auto f ) {
  26. return [=] ( auto t ) {
  27. if( t.valid ) {
  28. try {
  29. t.argument = f( t.argument );
  30. printf("argument = %d\n",t.argument);
  31. }
  32. catch(...) {
  33. t.valid = false;
  34. }
  35. }
  36.  
  37. return (t.valid) ? terminal_maybe( just( t.argument ) ) : terminal_maybe( nothing<decltype(t.argument)>() );
  38. };
  39. };
  40.  
  41. int main( int argc, char* argv[] )
  42. {
  43. auto plus_2 = [] ( auto arg ) { return arg + 2; };
  44. auto minus_2 = [] ( auto arg ) { return arg - 2; };
  45.  
  46. maybe<int> forty = just(40);
  47.  
  48. auto result = terminal_maybe(forty)
  49. (fmap_maybe( plus_2 ))
  50. (fmap_maybe( plus_2 ));
  51.  
  52. result([] (maybe<int> m) {
  53. if(m.valid) {
  54. printf("results = %d\n", m.argument);
  55. } else {
  56. printf("results = invalid\n");
  57. }
  58. } );
  59.  
  60. return 0;
  61. }
Success #stdin #stdout 0s 3096KB
stdin
Standard input is empty
stdout
argument = 42
argument = 44
results = 44