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; } }