Idris2/libs/base/Language/Reflection.idr

101 lines
2.2 KiB
Idris
Raw Normal View History

2020-05-18 18:57:43 +03:00
module Language.Reflection
import public Language.Reflection.TT
import public Language.Reflection.TTImp
export
2020-05-18 18:57:43 +03:00
data Elab : Type -> Type where
Pure : a -> Elab a
Bind : Elab a -> (a -> Elab b) -> Elab b
Fail : String -> Elab a
LogMsg : Nat -> String -> Elab ()
LogTerm : Nat -> String -> TTImp -> Elab ()
2020-05-18 18:57:43 +03:00
-- Check a TTImp term against the current goal type
Check : TTImp -> Elab TT
-- Get the current goal type, if known
-- (it might need to be inferred from the solution)
Goal : Elab (Maybe TTImp)
-- Generate a new unique name, based on the given string
GenSym : String -> Elab Name
-- Put a name in the current namespace
InCurrentNS : Name -> Elab Name
2020-05-18 18:57:43 +03:00
-- Get the types of every name which matches.
-- There may be ambiguities - returns a list of fully explicit names
-- and their types. If there's no results, the name is undefined.
GetType : Name -> Elab (List (Name, TTImp))
-- Get the constructors of a data type. The name must be fully resolved.
GetCons : Name -> Elab (List Name)
-- Check a group of top level declarations
Declare : List Decl -> Elab ()
2020-05-18 18:57:43 +03:00
mutual
export
2020-05-18 18:57:43 +03:00
Functor Elab where
map f e = do e' <- e
pure (f e')
export
2020-05-18 18:57:43 +03:00
Applicative Elab where
pure = Pure
f <*> a = do f' <- f
a' <- a
pure (f' a')
export
2020-05-18 18:57:43 +03:00
Monad Elab where
(>>=) = Bind
export
fail : String -> Elab a
fail = Fail
export
logMsg : Nat -> String -> Elab ()
logMsg = LogMsg
export
logTerm : Nat -> String -> TTImp -> Elab ()
logTerm = LogTerm
export
logGoal : Nat -> String -> Elab ()
logGoal n msg
= do g <- Goal
case g of
Nothing => pure ()
Just t => logTerm n msg t
-- Check a TTImp term against the current goal type
export
check : TTImp -> Elab TT
check = Check
export
goal : Elab (Maybe TTImp)
goal = Goal
export
genSym : String -> Elab Name
genSym = GenSym
export
inCurrentNS : Name -> Elab Name
inCurrentNS = InCurrentNS
export
getType : Name -> Elab (List (Name, TTImp))
getType = GetType
export
getCons : Name -> Elab (List Name)
getCons = GetCons
export
declare : List Decl -> Elab ()
declare = Declare