import { Err, Ok, Some } from "../src/lib.ts"; type MFrom = U extends Mapper ? Mapper : U extends true | false ? Mapper : Mapper; class Mapper { constructor(private v: T) {} map(actor: (v: T) => number): Mapper; map(actor: (v: T) => string): Mapper; map(actor: (v: T) => void): Mapper; map(actor: (v: T) => number | string | void) { return M(actor(this.v)); } } function M(m?: T): MFrom { return ( (m instanceof Mapper) ? m : new Mapper(m) ) as MFrom; } M(42).map((n) => `"${n}"`).map(console.log); M("42").map((s) => Number.parseInt(s, 5)).map(console.log); M(true).map((b) => b ? 42 : 0).map(console.log); M(Infinity).map((n) => 1 / n).map(console.log); const answer = (b: boolean) => b ? 42 : 0; Ok(2).map(console.log); Ok(false).map(answer).map(console.log); Ok(true).map(answer).map(console.log); Err(true).map((b) => `${b}?`).mapResult((err) => Ok(err ? "yes" : "no"), Ok) .map(console.log); Some(true).map((b) => !b).map(console.log);