0 | module Text.Show.PrettyVal.Derive
6 | import Text.Show.PrettyVal
7 | import Text.Show.Value
8 | import public Derive.Show
9 | import Derive.Prelude
11 | %language ElabReflection
22 | rec : String -> List (Value,String) -> Value
23 | rec con [] = Con (MkName con) []
24 | rec con ps = Rec (MkName con) $
map (\(v,n) => (MkName n, v)) ps
27 | named : Value -> String -> (VName,Value)
28 | named v name = (MkName name, v)
32 | other : String -> List Value -> Value
33 | other con = Con (MkName con)
43 | generalPrettyValType : (implicits : List Arg) -> (arg : TTImp) -> TTImp
44 | generalPrettyValType is arg = piAll `(~(arg) -> Value) is
49 | prettyValClaim : (fun : Name) -> (p : ParamTypeInfo) -> Decl
50 | prettyValClaim fun p =
51 | let tpe := generalPrettyValType (allImplicits p "PrettyVal") p.applied
56 | prettyValImplClaim : (impl : Name) -> (p : ParamTypeInfo) -> Decl
57 | prettyValImplClaim impl p = implClaim impl (implType "PrettyVal" p)
65 | prettyValImplDef : (fun, impl : Name) -> Decl
66 | prettyValImplDef f i = def i [patClause (var i) (var "MkPrettyVal" `app` var f)]
68 | parameters (nms : List Name)
69 | arg : BoundArg 1 Explicit -> TTImp
70 | arg (BA (MkArg M0 _ _ _) _ _) = `(Chr
"_")
71 | arg (BA (MkArg _ _ _ t) [x] _) = assertIfRec nms t `(prettyVal ~(var x))
73 | rhs : Name -> SnocList TTImp -> TTImp
74 | rhs n st = `(other ~(n.namePrim) ~(listOf st))
76 | narg : BoundArg 1 NamedExplicit -> TTImp
78 | let nm := (argName a).namePrim
80 | M0 => `(MkPair
~(nm) (Chr
"_"))
82 | let pv := assertIfRec nms a.type `(prettyVal ~(var x))
83 | in `(MkPair ~(pv) ~(nm))
85 | nrhs : Name -> SnocList TTImp -> TTImp
86 | nrhs n st = `(rec ~(n.namePrim) ~(listOf st))
89 | pvClauses : (fun : Maybe Name) -> TypeInfo -> List Clause
90 | pvClauses fun ti = map clause ti.cons
93 | lhs : TTImp -> TTImp
94 | lhs bc = maybe bc ((`app` bc) . var) fun
96 | clause : Con ti.arty ti.args -> Clause
97 | clause c = case all namedArg c.args of
98 | True => accumArgs namedExplicit lhs (nrhs c.name) narg c
99 | False => accumArgs explicit lhs (rhs c.name) arg c
102 | prettyValDef : Name -> TypeInfo -> Decl
103 | prettyValDef fun ti = def fun (pvClauses (Just fun) ti)
114 | derivePrettyVal : Elab (PrettyVal f)
115 | derivePrettyVal = do
117 | | Nothing => fail "Can't infer goal"
118 | let Just (resTpe, nm) := extractResult tpe
119 | | Nothing => fail "Invalid goal type: \{show tpe}"
122 | let impl := lam (lambdaArg {a = Name} "x") $
123 | iCase `(x
) implicitFalse (pvClauses [ti.name] Nothing ti)
125 | logMsg "derive.definitions" 1 $
show impl
126 | check $
var "MkPrettyVal" `app` impl
130 | PrettyVal : List Name -> ParamTypeInfo -> Res (List TopLevel)
132 | let fun := funName p "prettyVal"
133 | impl := implName p "PrettyVal"
134 | in Right [ TL (prettyValClaim fun p) (prettyValDef nms fun p.info)
135 | , TL (prettyValImplClaim impl p) (prettyValImplDef fun impl)
138 | %runElab derive "Bool" [PrettyVal]
140 | %runElab derive "Ordering" [PrettyVal]
142 | %runElab derive "Maybe" [PrettyVal]
144 | %runElab derive "Either" [PrettyVal]
146 | %runElab derive "List1" [PrettyVal]
148 | %runElab derive "Prec" [PrettyVal]
152 | %runElab derive "VName" [PrettyVal]
154 | %runElab derive "Value" [PrettyVal]
156 | %runElab derive "Text.Show.Value.Token" [PrettyVal]
158 | %runElab derive "Text.Show.Value.Err" [PrettyVal]
160 | %runElab derive "Text.Bounds.Position" [PrettyVal]
162 | %runElab derive "Text.Bounds.Bounds" [PrettyVal]
164 | %runElab derive "Text.Bounds.Bounded" [PrettyVal]
166 | %runElab derive "Text.ParseError.DigitType" [PrettyVal]
168 | %runElab derive "Text.ParseError.CharClass" [PrettyVal]
170 | %runElab derive "Text.FC.Origin" [PrettyVal]
172 | %runElab derive "Text.FC.FileContext" [PrettyVal]
174 | %runElab derive "Text.ParseError.InnerError" [PrettyVal]
176 | %runElab derive "Text.ParseError.ParseError" [PrettyVal]
180 | %runElab derive "System.File.Mode.Mode" [PrettyVal]
182 | %runElab derive "FileError" [PrettyVal]
184 | %runElab derive "FileMode" [PrettyVal]
186 | %runElab derive "Permissions" [PrettyVal]
188 | %runElab derive "ClockType" [PrettyVal]
192 | %runElab derive "ModuleIdent" [PrettyVal]
194 | %runElab derive "VirtualIdent" [PrettyVal]
196 | %runElab derive "OriginDesc" [PrettyVal]
198 | %runElab derive "Language.Reflection.TT.FC" [PrettyVal]
200 | %runElab derive "WithFC" [PrettyVal]
202 | %runElab derive "NameType" [PrettyVal]
204 | %runElab derive "PrimType" [PrettyVal]
206 | %runElab derive "Constant" [PrettyVal]
208 | %runElab derive "Namespace" [PrettyVal]
210 | %runElab derive "UserName" [PrettyVal]
212 | %runElab derive "Language.Reflection.TT.Name" [PrettyVal]
214 | %runElab derive "Count" [PrettyVal]
216 | %runElab derive "PiInfo" [PrettyVal]
218 | %runElab derive "LazyReason" [PrettyVal]
220 | %runElab derive "TotalReq" [PrettyVal]
222 | %runElab derive "Visibility" [PrettyVal]
224 | %runElab derive "WithDefault" [PrettyVal]
226 | %runElab derive "BindMode" [PrettyVal]
228 | %runElab derive "UseSide" [PrettyVal]
230 | %runElab derive "DotReason" [PrettyVal]
232 | %runElab derive "DataOpt" [PrettyVal]
234 | %runElab derive "WithFlag" [PrettyVal]
236 | %runElab derive "BuiltinType" [PrettyVal]
238 | %runElab deriveMutual