@@ -6,23 +6,31 @@ quoters and unquoters along with some supporting datatypes.
66module Idris.Reflection where
77
88import Control.Monad (liftM, liftM2)
9+import Data.Maybe (catMaybes)
910import Data.List ((\\))
1011import qualified Data.Text as T
1112
1213import Idris.Core.Elaborate (claim, fill, focus, getNameFrom, initElaborator,
1314 movelast, runElab, solve)
14−import Idris.Core.Evaluate (initContext)
15+import Idris.Core.Evaluate (Context, Def(TyDecl), initContext, lookupDefExact, lookupTyExact)
1516import Idris.Core.TT
1617
1718import Idris.AbsSyntaxTree (ElabD, IState, PArg'(..), PArg, PTactic, PTactic'(..),
1819 PTerm(..), initEState, pairCon, pairTy)
1920import Idris.Delaborate (delab)
2021
21−data RArg = RExplicit { argName :: Name, argTy :: Raw }
22− | RImplicit { argName :: Name, argTy :: Raw }
22+data RArg = RExplicit { argName :: Name, argTy :: Raw }
23+ | RImplicit { argName :: Name, argTy :: Raw }
2324 | RConstraint { argName :: Name, argTy :: Raw }
25+ deriving Show
2426
25−data RTyDecl = RDeclare Name [RArg] Raw
27+data RTyDecl = RDeclare Name [RArg] Raw deriving Show
28+
29+data RTyConArg = RParameter { tcArgName :: Name, tcArgTy :: Raw }
30+ | RIndex { tcArgName :: Name, tcArgTy :: Raw }
31+ deriving Show
32+
33+data RDatatype = RDatatype Name [RTyConArg] Raw [(Name, Raw)] deriving Show
2634
2735rArgToPArg :: RArg -> PArg
2836rArgToPArg (RExplicit n _) = PExp 0 [] n Placeholder
@@ -896,3 +904,37 @@ envTupleType
896904 = raw_apply (Var pairTy) [ (Var $ reflm "TTName")
897905 , (RApp (Var $ reflm "Binder") (Var $ reflm "TT"))
898906 ]
907+
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
914+ ]
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
920+
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)
927+
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
937+ ]
938+ ]
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]