0 | module Derive.TSV.Encoder
2 | import Language.Reflection.Util
13 | encClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
14 | encClaim vis fun p =
15 | let arg := p.applied
16 | tpe := piAll `(SnocList
String -> ~(arg) -> SnocList
String) (allImplicits p "TSVEncoder")
17 | in simpleClaim vis fun tpe
22 | encoderImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
23 | encoderImplClaim v impl p = implClaimVis v impl (implType "TSVEncoder" p)
30 | encoderImplDef : (fun, impl : Name) -> Decl
31 | encoderImplDef f i =
32 | def i [patClause (var i) (var "MkTSVEncoder" `app` var f)]
34 | appArgs : TTImp -> List (BoundArg 1 Explicit) -> TTImp
36 | appArgs t (BA _ [x] _ :: xs) = appArgs `(encodeOnto
~(t) ~(var x)) xs
38 | encClause : Name -> Con n vs -> Clause
40 | let xs := freshNames "x" c.arty
42 | sx := boundArgs explicit c.args [xs]
43 | in patClause `(~(var f) sc
~(cx)) (appArgs `(sc
) $
sx <>> [])
45 | enumClause : Name -> Con n vs -> Clause
46 | enumClause f c = patClause `(~(var f) sc
~(c.nameVar)) `(sc :<
~(c.namePrim))
49 | encDef : Name -> Con n vs -> Decl
50 | encDef f c = def f [encClause f c]
53 | enumDef : Name -> ParamTypeInfo -> Decl
54 | enumDef f c = def f (map (enumClause f) c.info.cons)
62 | TSVEncoderVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
63 | TSVEncoderVis vis nms p =
64 | let fun := funName p "encodeOnto"
65 | impl := implName p "TSVEncoder"
66 | in case p.info.cons of
69 | [ TL (encClaim vis fun p) (encDef fun c)
70 | , TL (encoderImplClaim vis impl p) (encoderImplDef fun impl)
73 | case isEnum p.info of
74 | False => failRecord "TSVEncoder"
77 | [ TL (encClaim vis fun p) (enumDef fun p)
78 | , TL (encoderImplClaim vis impl p) (encoderImplDef fun impl)
83 | TSVEncoder : List Name -> ParamTypeInfo -> Res (List TopLevel)
84 | TSVEncoder = TSVEncoderVis Public