PLFA agda exercises
------------------------------------------------------------------------
-- The Agda standard library
--
-- Basic type and definition of the reader monad transformer
------------------------------------------------------------------------

{-# OPTIONS --cubical-compatible --safe #-}

module Effect.Monad.Reader.Transformer.Base {r} (R : Set r) where

open import Level using (Level; suc; _⊔_)
open import Function.Base using (id)

private
  variable
    g : Level
    A : Set r

------------------------------------------------------------------------
-- Reader monad operations

record RawMonadReader
       (M : Set r → Set g)
       : Set (suc r ⊔ g) where
  field
    reader : (R → A) → M A
    local  : (R → R) → M A → M A

  ask : M R
  ask = reader id

------------------------------------------------------------------------
-- Reader monad transformer

record ReaderT
       (M : Set r → Set g)
       (A : Set r)
       : Set (r ⊔ g) where
  constructor mkReaderT
  field runReaderT : R → M A
open ReaderT public