Skip to content

Instantly share code, notes, and snippets.

@sasajib
Created November 15, 2023 15:18
Show Gist options
  • Save sasajib/687a152d92c6fed65e1d2a2357a6a765 to your computer and use it in GitHub Desktop.
Save sasajib/687a152d92c6fed65e1d2a2357a6a765 to your computer and use it in GitHub Desktop.

Revisions

  1. sasajib created this gist Nov 15, 2023.
    41 changes: 41 additions & 0 deletions either.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@
    export class Either<L, R> {
    constructor(private left: L | null, private right: R | null) {}

    static left<L, R>(value: L): Either<L, R> {
    return new Either<L, R>(value, null);
    }

    static right<L, R>(value: R): Either<L, R> {
    return new Either<L, R>(null, value);
    }

    isLeft(): boolean {
    return this.left !== null;
    }

    isRight(): boolean {
    return this.right !== null;
    }

    getLeft(): L {
    if (this.isLeft()) {
    return this.left as L;
    }
    throw new Error("Attempted to get Left value from a Right");
    }

    getRight(): R {
    if (this.isRight()) {
    return this.right as R;
    }
    throw new Error("Attempted to get Right value from a Left");
    }

    map<T>(f: (right: R) => T): Either<L, T> {
    if (this.isRight()) {
    return Either.right<L, T>(f(this.getRight()));
    } else {
    return Either.left<L, T>(this.getLeft() as L);
    }
    }
    }