import identity from "../function/identity";
/**
* The identity monad, it's a simple container that just wraps the value.
*
* @class
* @name Identity
*/
export default class Identity {
constructor(x) {
this.$value = x;
}
static of(x) {
return new Identity(x);
}
equals(other) {
return this.$value === other.$value;
}
map(fn) {
return Identity.of(fn(this.$value));
}
ap(f) {
return f.map(this.$value);
}
chain(fn) {
return this.map(fn).join();
}
join() {
return this.$value;
}
sequence(of) {
return this.traverse(of, identity);
}
traverse(of, fn) {
return fn(this.$value).map(Identity.of);
}
}