Skip to content

Instantly share code, notes, and snippets.

@davidchase
Created August 29, 2021 12:35

Revisions

  1. davidchase created this gist Aug 29, 2021.
    35 changes: 35 additions & 0 deletions reader.elm
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    module Reader exposing
    ( return
    , ask
    , runReader
    , local
    , fmap
    , chain
    )

    type Reader r a = Reader (r -> a)

    id x = x

    constant a = \_ -> a

    return a = Reader (constant a)

    ask = Reader id

    runReader e reader =
    case reader of
    Reader r -> r(e)

    local f reader =
    Reader (\c -> runReader f(c) reader)

    fmap f reader =
    Reader (\c -> f(runReader c reader))

    chain f reader =
    Reader (\c -> runReader c (f(runReader c reader)))

    -- fun to derive
    map f reader =
    chain (\a -> pointed (f(a))) reader