5 | module Language.Reflection.Compat
7 | import public Data.List.Quantifiers
8 | import public Data.List1
9 | import public Data.String
10 | import public Data.Vect
12 | import public Deriving.Show
14 | import public Language.Reflection
15 | import Language.Reflection.Expr
16 | import Language.Reflection.Logging
17 | import public Language.Reflection.Syntax
18 | import public Language.Reflection.Syntax.Ops
22 | %language ElabReflection
37 | countShow : Show Count
38 | countShow = %runElab derive
41 | piInfoShow : Show a => Show (PiInfo a)
42 | piInfoShow = %runElab derive
46 | argShow = %runElab derive
50 | conShow = %runElab derive
54 | getCon : Elaboration m => Name -> m Con
55 | getCon n = do (n', tt) <- lookupName n
56 | let (args, tpe) = unPi $
cleanupNamedHoles tt
57 | pure $
MkCon n' args tpe
60 | LogPosition Con where
61 | logPosition con = do
62 | let fullName = show con.name
63 | let fullName' = unpack fullName
64 | maybe fullName (pack . flip drop fullName' . S . finToNat) $
findLastIndex (== '.') fullName'
74 | record TypeInfo where
75 | constructor MkTypeInfo
81 | LogPosition TypeInfo where
82 | logPosition = show . name
85 | tiShow : Show TypeInfo
86 | tiShow = %runElab derive
92 | getInfo' : Elaboration m => Name -> m TypeInfo
94 | (n',tt) <- lookupName n
95 | let (args,IType _) = unPi $
cleanupNamedHoles tt
96 | | (_,_) => fail "Type declaration does not end in IType"
97 | conNames <- getCons n'
98 | cons <- traverse getCon conNames
99 | pure (MkTypeInfo n' args cons)
103 | getInfo : Name -> Elab TypeInfo
109 | data ConArgsNamed : Con -> Type where
110 | TheyAreNamed : All IsNamedArg ars -> ConArgsNamed $
MkCon nm ars ty
113 | areConArgsNamed : (con : Con) -> Dec $
ConArgsNamed con
114 | areConArgsNamed $
MkCon _ ars _ with (all isNamedArg ars)
115 | _ | Yes ars' = Yes $
TheyAreNamed ars'
116 | _ | No nars = No $
\(TheyAreNamed ars') => nars ars'
119 | 0 conArgsNamed : (0 _ : ConArgsNamed c) => All IsNamedArg c.args
120 | conArgsNamed @{TheyAreNamed p} = p
123 | data AllTyArgsNamed : TypeInfo -> Type where
124 | TheyAllAreNamed : All IsNamedArg ars -> All ConArgsNamed cns -> AllTyArgsNamed $
MkTypeInfo nm ars cns
127 | areAllTyArgsNamed : (ty : TypeInfo) -> Dec $
AllTyArgsNamed ty
128 | areAllTyArgsNamed $
MkTypeInfo _ ars cns with (all isNamedArg ars, all areConArgsNamed cns)
129 | _ | (Yes ars', Yes cns') = Yes $
TheyAllAreNamed ars' cns'
130 | _ | (No nars, _) = No $
\(TheyAllAreNamed ars' _) => nars ars'
131 | _ | (_, No ncns) = No $
\(TheyAllAreNamed _ cns') => ncns cns'
134 | 0 (.tyArgsNamed) : (0 _ : AllTyArgsNamed t) -> All IsNamedArg t.args
135 | (.tyArgsNamed) (TheyAllAreNamed at ct) = at
138 | 0 (.tyConArgsNamed) : (0 _ : AllTyArgsNamed t) -> All ConArgsNamed t.cons
139 | (.tyConArgsNamed) (TheyAllAreNamed at ct) = ct
145 | public export %inline
146 | (.tyName) : TypeInfo -> Name
149 | public export %inline
150 | (.tyArgs) : TypeInfo -> List Arg
153 | public export %inline
154 | (.tyCons) : TypeInfo -> List Con
157 | public export %inline
158 | (.conArgs) : Con -> List Arg
162 | [ConEqByName] Eq Con where
163 | (==) = (==) `on` name
166 | [ConOrdByName] Ord Con using ConEqByName where
167 | compare = comparing name