@@ -6,23 +6,31 @@ quoters and unquoters along with some supporting datatypes.
6module Idris.Reflection where
6module Idris.Reflection where
8import Control.Monad (liftM, liftM2)
8import Control.Monad (liftM, liftM2)
9+import Data.Maybe (catMaybes)
9import Data.List ((\\))
10import Data.List ((\\))
10import qualified Data.Text as T
11import qualified Data.Text as T
12import Idris.Core.Elaborate (claim, fill, focus, getNameFrom, initElaborator,
13import Idris.Core.Elaborate (claim, fill, focus, getNameFrom, initElaborator,
13 movelast, runElab, solve)
14 movelast, runElab, solve)
14−import Idris.Core.Evaluate (initContext)
15+import Idris.Core.Evaluate (Context, Def(TyDecl), initContext, lookupDefExact, lookupTyExact)
15import Idris.Core.TT
16import Idris.Core.TT
17import Idris.AbsSyntaxTree (ElabD, IState, PArg'(..), PArg, PTactic, PTactic'(..),
18import Idris.AbsSyntaxTree (ElabD, IState, PArg'(..), PArg, PTactic, PTactic'(..),
18 PTerm(..), initEState, pairCon, pairTy)
19 PTerm(..), initEState, pairCon, pairTy)
19import Idris.Delaborate (delab)
20import Idris.Delaborate (delab)
21−data RArg = RExplicit { argName :: Name, argTy :: Raw }
22+data RArg = RExplicit { argName :: Name, argTy :: Raw }
22− | RImplicit { argName :: Name, argTy :: Raw }
23+ | RImplicit { argName :: Name, argTy :: Raw }
23 | RConstraint { argName :: Name, argTy :: Raw }
24 | RConstraint { argName :: Name, argTy :: Raw }
25−data RTyDecl = RDeclare Name [RArg] Raw
27+data RTyDecl = RDeclare Name [RArg] Raw deriving Show
29+data RTyConArg = RParameter { tcArgName :: Name, tcArgTy :: Raw }
30+ | RIndex { tcArgName :: Name, tcArgTy :: Raw }
33+data RDatatype = RDatatype Name [RTyConArg] Raw [(Name, Raw)] deriving Show
27rArgToPArg :: RArg -> PArg
35rArgToPArg :: RArg -> PArg
28rArgToPArg (RExplicit n _) = PExp 0 [] n Placeholder
36rArgToPArg (RExplicit n _) = PExp 0 [] n Placeholder
@@ -896,3 +904,37 @@ envTupleType
896 = raw_apply (Var pairTy) [ (Var $ reflm "TTName")
904 = raw_apply (Var pairTy) [ (Var $ reflm "TTName")
897 , (RApp (Var $ reflm "Binder") (Var $ reflm "TT"))
905 , (RApp (Var $ reflm "Binder") (Var $ reflm "TT"))
908+-- | Build the reflected datatype definition(s) that correspond(s) to
909+-- a provided unqualified name
910+buildDatatypes :: Context -> Ctxt TypeInfo -> Name -> [RDatatype]
911+buildDatatypes ctxt datatypes n =
912+ catMaybes [ mkDataType dn ti
913+ | (dn, ti) <- lookupCtxtName n datatypes
915+ where mkDataType name (TI {param_pos = params, con_names = constrs}) =
916+ do (TyDecl (TCon _ _) ty) <- lookupDefExact name ctxt
917+ let (tcargs, tcres) = getArgs params (forget ty) 0
918+ conTys <- mapM (fmap forget . flip lookupTyExact ctxt) constrs
919+ return $ RDatatype name tcargs tcres $ zip constrs conTys
921+ getArgs params (RBind an (Pi _ ty _) body) i =
922+ let (args, res) = getArgs params body (i+1)
923+ in if i `elem` params
924+ then (RParameter an ty : args, res )
925+ else (RIndex an ty : args, res)
926+ getArgs _ tm _ = ([], tm)
928+reflectDatatype :: RDatatype -> Raw
929+reflectDatatype (RDatatype tyn tyConArgs tyConRes constrs) =
930+ raw_apply (Var $ tacN "MkDatatype") [ reflectName tyn
931+ , rawList (Var $ tacN "TyConArg") (map reflectConArg tyConArgs)
932+ , reflectRaw tyConRes
933+ , rawList (rawPairTy (Var $ reflm "TTName") (Var $ reflm "Raw"))
934+ [ rawPair ((Var $ reflm "TTName"), (Var $ reflm "Raw"))
935+ (reflectName cn, reflectRaw cty)
936+ | (cn, cty) <- constrs
939+ where reflectConArg (RParameter n t) = raw_apply (Var $ tacN "Parameter") [reflectName n, reflectRaw t]
940+ reflectConArg (RIndex n t) = raw_apply (Var $ tacN "Index") [reflectName n, reflectRaw t]