/- Copyright (c) 2019 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Leonardo de Moura, Sebastian Ullrich -/ prelude import Init.Control.Reader import Init.System.IO import Init.Lean.Environment namespace Lean universe u /-- `HasEval` extension that gives access to the current environment & options. The basic `HasEval` class is in the prelude and should not depend on these types. -/ class MetaHasEval (α : Type u) := (eval : Environment → Options → α → IO Unit) instance MetaHasEvalOfHasEval {α : Type u} [HasEval α] : MetaHasEval α := ⟨fun env opts a => HasEval.eval a⟩ abbrev MetaIO := ReaderT (Environment × Options) IO def MetaIO.getEnv : MetaIO Environment := do ctx ← read; pure ctx.1 def MetaIO.getOptions : MetaIO Options := do ctx ← read; pure ctx.2 instance MetaIO.metaHasEval : MetaHasEval (MetaIO Unit) := ⟨fun env opts x => x (env, opts)⟩ instance MetaIO.monadIO : MonadIO MetaIO := ⟨fun _ x _ => x⟩ end Lean