Skip to content

Instantly share code, notes, and snippets.

@glguy
Created October 20, 2020 04:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glguy/a8be2d28c212c116a76035401710c4ad to your computer and use it in GitHub Desktop.
Save glguy/a8be2d28c212c116a76035401710c4ad to your computer and use it in GitHub Desktop.
{-# Language DeriveFunctor #-}
module Help where
import Control.Monad.Free
newtype ReaderF r a = Ask (r -> a)
deriving Functor
type Reader r = Free (ReaderF r)
runReaderF :: r -> ReaderF r a -> a
runReaderF r (Ask f) = f r
runReader :: r -> Reader r a -> a
runReader r = iter (runReaderF r)
ask :: Reader r r
ask = wrap (Ask pure)
local :: (r -> s) -> Reader s a -> Reader r a
local f = hoistFree (\(Ask g) -> Ask (g . f))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment