Skip to content

Instantly share code, notes, and snippets.

@saswata-dutta
Forked from TheSeamau5/Maybe.cpp
Created May 24, 2020 20:16
Show Gist options
  • Save saswata-dutta/acdc6913c1eb102617b99de35e6e35ad to your computer and use it in GitHub Desktop.
Save saswata-dutta/acdc6913c1eb102617b99de35e6e35ad to your computer and use it in GitHub Desktop.
Maybe in C++
#include <string>
#include <functional>
using namespace std;
template <typename T>
struct Maybe{
T just;
bool isNothing;
};
template <typename T>
Maybe<T>* makeMaybe(T just, bool isNothing){
Maybe<T>* maybe = (struct Maybe<T>*) malloc (sizeof(struct Maybe<T>));
maybe->just = just;
maybe->isNothing = isNothing;
return maybe;
}
template <typename T>
Maybe<T>* Just(T just){
return makeMaybe(just, false);
}
template <typename T>
Maybe<T>* Nothing(){
return makeMaybe((T) 0, true);
}
template <typename T>
bool isNothing(Maybe<T>* maybe){
return maybe == NULL || maybe->isNothing;
}
template <typename T>
string toString(Maybe<T>* maybe){
return isNothing(maybe) ? "Nothing" : "Just " + to_string(maybe->just);
}
template <typename A, typename B>
Maybe<B>* map (function<B(A)> f, Maybe<A>* maybe){
return isNothing(maybe) ? Nothing<B>() : Just(f(maybe->just));
}
template <typename A, typename B>
Maybe<B>* operator >>= (Maybe<A>* maybe, function<Maybe<B>*(A)> f){
return isNothing(maybe) ? Nothing<B>() : f(maybe->just);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment