Skip to content

Instantly share code, notes, and snippets.

@venil7
Last active August 29, 2022 03:19

Revisions

  1. venil7 revised this gist Apr 6, 2018. 1 changed file with 20 additions and 6 deletions.
    26 changes: 20 additions & 6 deletions reader-monad.ts
    Original file line number Diff line number Diff line change
    @@ -1,15 +1,29 @@
    class ReaderMonad<A,B> {
    constructor(private runReader: (a:A) => B) {
    class ReaderMonad<A, B> {
    constructor(public runReader: (a: A) => B) {
    }

    bind<C>(func: (b:B) => ReaderMonad<A,C>): ReaderMonad<A,C> {
    return new ReaderMonad<A, C>((a:A) => {
    bind<C>(func: (b: B) => ReaderMonad<A, C>): ReaderMonad<A, C> {
    return new ReaderMonad<A, C>((a: A) => {
    const b = this.runReader(a);
    return func(b).runReader(a);
    });
    }

    static return<A, B>(b: B): ReaderMonad<A,B> {
    static return<A, B>(b: B): ReaderMonad<A, B> {
    return new ReaderMonad((a: A) => b);
    }
    }
    }

    const uppercase = new ReaderMonad((s: string) =>
    s.toUpperCase())
    const reverse = new ReaderMonad((s: string) =>
    s.split('').reverse().join(''));


    const reader = uppercase
    .bind(s1 => reverse
    .bind(s2 => ReaderMonad.return([s1, s2])));


    const result = reader.runReader("hello"); //["HELLO", "olleh"]

  2. venil7 created this gist Apr 6, 2018.
    15 changes: 15 additions & 0 deletions reader-monad.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    class ReaderMonad<A,B> {
    constructor(private runReader: (a:A) => B) {
    }

    bind<C>(func: (b:B) => ReaderMonad<A,C>): ReaderMonad<A,C> {
    return new ReaderMonad<A, C>((a:A) => {
    const b = this.runReader(a);
    return func(b).runReader(a);
    });
    }

    static return<A, B>(b: B): ReaderMonad<A,B> {
    return new ReaderMonad((a: A) => b);
    }
    }