Created
November 18, 2014 19:47
-
-
Save hcarvalhoalves/fe400a55c1dd993d8d4d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| export interface MonadI<T> { | |
| lift<U>(transform: (v: T) => U): MonadI<U>; | |
| bind<U>(transform: (v: T) => MonadI<U>): MonadI<U>; | |
| } | |
| export interface MaybeI<T> extends MonadI<T> { | |
| isEmpty: boolean; | |
| toString(): string; | |
| get(): any; | |
| } | |
| export interface MaybeCase<T, U> { | |
| just: (v: T) => U; | |
| nothing: () => U; | |
| } | |
| export class Just<T> implements MaybeI<T> { | |
| isEmpty: boolean = false; | |
| private value: T; | |
| constructor(value: T) { | |
| this.value = value; | |
| } | |
| toString():string { | |
| return 'Just -> {}'.replace('{}', this.value.toString()); | |
| } | |
| get():T { | |
| return this.value; | |
| } | |
| lift<U>(transform: (v: T) => U): MaybeI<U> { | |
| return maybe<U>(transform(this.value)); // We don't know... | |
| } | |
| bind<U>(transform: (v: T) => Just<U>): Just<U> { | |
| return transform(this.value); | |
| } | |
| caseOf<U>(branches: MaybeCase<T, U>) { | |
| return branches.just(this.value); | |
| } | |
| } | |
| export class Nothing<T> implements MaybeI<T> { | |
| isEmpty: boolean = true; | |
| toString():string { | |
| return 'Nothing'; | |
| } | |
| get():void { | |
| throw "Can't get() from Nothing<T>"; | |
| } | |
| lift<U>(transform: (v: T) => U): MaybeI<U> { | |
| return new Nothing<U>(); | |
| } | |
| bind<U>(transform: (v: T) => Just<U>): Nothing<U> { | |
| return new Nothing<U>(); | |
| } | |
| caseOf<U>(branches: MaybeCase<T, U>) { | |
| return branches.nothing(); | |
| } | |
| } | |
| export function just<T>(v: T) { | |
| return new Just<T>(v); | |
| } | |
| export function nothing<T>() { | |
| return new Nothing<T>(); | |
| } | |
| export function maybe<T>(v?: T) { | |
| if (v === null || v === undefined) return nothing<T>(); | |
| return just<T>(v); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment