0 | module Derive.RecordB
2 | import Language.Reflection.Util
3 | import Derive.BarbieInfo
11 | blensTpe : (k : TTImp) -> TTImp -> TTImp
14 | (0 f : ~(k) -> Type)
16 | -> Lens'
(~(arg) f
) (f v
)
20 | blensClaim : Visibility -> (fun : Name) -> (p : BarbieInfo) -> Decl
21 | blensClaim vis fun p =
22 | simpleClaim vis fun $
piAll (blensTpe p.kind p.applied) p.implicits
27 | recordImplClaim : Visibility -> (impl : Name) -> (p : BarbieInfo) -> Decl
28 | recordImplClaim vis impl p =
29 | let tpe := piAll `(RecordB
~(p.kind) ~(p.applied)) p.implicits
30 | in implClaimVis vis impl tpe
37 | recordImplDef : (fld, impl : Name) -> Decl
38 | recordImplDef fld impl = def impl [patClause (var impl) `(MkRecordB
~(var fld))]
40 | lclause : (String -> String) -> Name -> BoundArg 0 RegularNamed -> Clause
41 | lclause f fun (BA x _ _) =
42 | let fld := argName x
43 | nme := UN $
Basic (f $
nameStr fld)
44 | u := update [ISetField [nameStr fld] `(x
)] `(y
)
45 | in patClause `(~(var fun) _ ~(var nme)) `(lens
~(var fld) $
\x,y => ~(u))
48 | lensDef : (String -> String) -> Name -> Con n vs -> Decl
50 | def fun (lclause f fun <$> (boundArgs regularNamed c.args [] <>> []))
64 | -> Res (List TopLevel)
65 | RecordBVis f vis nms p = case barbieArgs p.info.args of
66 | Just prf => case p.info.cons of
68 | let nlens := funName p "bfield"
69 | impl := implName p "RecordB"
72 | [ TL (blensClaim vis nlens bti) (lensDef f nlens c)
73 | , TL (recordImplClaim vis impl bti)
74 | (recordImplDef nlens impl)
76 | _ => failRecord "RecordB"
77 | Nothing => Left $
"Not a barbie type"
85 | -> Res (List TopLevel)
86 | RecordB f = RecordBVis f Public