import identity from "../function/identity";
/**
* The Maybe monad - goes through with operations on the value;
* does nothing when the value is nil.
*
* @class
*/
class Maybe {
constructor(x) {
this.value = x;
}
static of(x) {
return new Maybe(x);
}
get isNothing() {
return this.value === null || this.value === undefined;
}
get isJust() {
return !this.isNothing;
}
map(fn) {
return this.isNothing ? this : Maybe.of(fn(this.value));
}
ap(f) {
return this.isNothing ? this : f.map(this.value);
}
equals(other) {
return (this.isNothing && other.isNothing) || this.value === other.value;
}
chain(fn) {
return this.map(fn).join();
}
join() {
return this.isNothing ? this : this.value;
}
getValue() {
return this.value;
}
sequence(of) {
return this.traverse(of, identity);
}
traverse(of, fn) {
return this.isNothing ? of(this) : fn(this.value).map(Maybe.of);
}
}
export default Maybe;