import { Monad } from './Monad';
/**
* Identity
*/
export class Identity implements Monad {
a: A;
constructor(a: A) {
this.a = a;
}
/**
* of
*/
of(a: A): Identity {
return new Identity(a);
}
/**
* map
*/
map(f: (a: A) => B): Identity {
return new Identity(f(this.get()));
}
/**
* chain
*/
chain(f: (a: A) => Identity): Identity {
return f(this.get());
}
/**
* ap
*/
ap(i: Identity<(a: A) => B>): Identity {
return i.map(f => f(this.get()));
}
/**
* get the value of an Identity
* @summary get :: Identity → A
*/
get(): A {
return this.a;
}
}