2 | import Language.Reflection.Util
11 | conWithArgs : Prec -> String -> List String -> String
12 | conWithArgs p str [] = str
13 | conWithArgs p str ss = showCon p str $
concat ss
16 | recordWithArgs : Prec -> String -> List (String,String) -> String
17 | recordWithArgs p str [] = str
18 | recordWithArgs p str ss =
19 | let args := concat $
intersperse ", " $
map (\(n,v) => "\{n} = \{v}") ss
20 | in showCon p str $
" {\{args}}"
28 | namedArg : (a : Arg) -> Bool
29 | namedArg (MkArg _ ExplicitArg (Just $
UN _) _) = True
30 | namedArg (MkArg _ ExplicitArg _ _) = False
31 | namedArg (MkArg _ ImplicitArg _ _) = True
32 | namedArg (MkArg _ AutoImplicit _ _) = True
33 | namedArg (MkArg _ (DefImplicit _) _ _) = True
43 | generalShowType : (implicits : List Arg) -> (arg : TTImp) -> TTImp
44 | generalShowType is arg = piAll `(Prec
-> ~(arg) -> String) is
49 | showClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
50 | showClaim vis fun p =
51 | simpleClaim vis fun (generalShowType (allImplicits p "Show") p.applied)
55 | showImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
56 | showImplClaim v impl p = implClaimVis v impl (implType "Show" p)
64 | showImplDef : (fun, impl : Name) -> Decl
65 | showImplDef f i = def i [patClause (var i) (var "mkShowPrec" `app` var f)]
70 | parameters (nms : List Name)
72 | arg : BoundArg 1 Explicit -> TTImp
73 | arg (BA (MkArg M0 _ _ _) _ _) = primVal (Str " _")
74 | arg (BA (MkArg _ _ _ t) [x] _) = assertIfRec nms t `(showArg
~(var x))
77 | rhs : Name -> SnocList TTImp -> TTImp
78 | rhs n [<] = n.namePrim
79 | rhs n st = `(conWithArgs p
~(n.namePrim) ~(listOf st))
82 | narg : BoundArg 1 NamedExplicit -> TTImp
84 | let nm := (argName a).namePrim
86 | M0 => `(MkPair
~(nm) "_")
88 | let shown := assertIfRec nms a.type `(show
~(var x))
89 | in `(MkPair
~(nm) ~(shown))
92 | nrhs : Name -> SnocList TTImp -> TTImp
93 | nrhs n [<] = n.namePrim
94 | nrhs n st = `(recordWithArgs p
~(n.namePrim) ~(listOf st))
97 | showClauses : (fun : Maybe Name) -> TypeInfo -> List Clause
98 | showClauses fun ti = map clause ti.cons
101 | lhs : TTImp -> TTImp
102 | lhs bc = maybe bc (\x => `(~(var x) ~(pvar) ~(bc))) fun
104 | clause : Con ti.arty ti.args -> Clause
105 | clause c = case all namedArg c.args of
106 | True => accumArgs namedExplicit lhs (nrhs c.name) narg c
107 | False => accumArgs explicit lhs (rhs c.name) arg c
110 | showDef : Name -> TypeInfo -> Decl
111 | showDef fun ti = def fun (showClauses (Just fun) ti)
122 | deriveShow : Elab (Show f)
125 | | Nothing => fail "Can't infer goal"
126 | let Just (resTpe, nm) := extractResult tpe
127 | | Nothing => fail "Invalid goal type: \{show tpe}"
131 | lam (lambdaArg {a = Name} "p") $
132 | lam (lambdaArg {a = Name} "x") $
133 | iCase `(x
) implicitFalse (showClauses [ti.name] Nothing ti)
135 | logMsg "derive.definitions" 1 $
show impl
136 | check $
var "mkShowPrec" `app` impl
140 | ShowVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
141 | ShowVis vis nms p =
142 | let fun := funName p "showPrec"
143 | impl := implName p "Show"
145 | [ TL (showClaim vis fun p) (showDef nms fun p.info)
146 | , TL (showImplClaim vis impl p) (showImplDef fun impl)
151 | Show : List Name -> ParamTypeInfo -> Res (List TopLevel)
152 | Show = ShowVis Public