2 | import public Derive.Lens.Options
3 | import public Language.Reflection.Util
7 | parameters (o : LensOptions)
9 | lname n = UN $
Basic (o.fieldName $
nameStr n)
11 | lclaim : Visibility -> ParamTypeInfo -> BoundArg 0 RegularNamed -> Decl
12 | lclaim vis p (BA x _ _) =
13 | let arg := p.applied
14 | tpe := piAll `(Lens'
~(arg) ~(x.type)) p.implicits
15 | in simpleClaim vis (lname $
argName x) tpe
17 | ldef : BoundArg 0 RegularNamed -> Decl
19 | let fld := argName x
21 | u := update [ISetField [nameStr fld] `(x
)] `(y
)
22 | in def nme [patClause (var nme) `(lens
~(var fld) $
\x,y => ~(u))]
27 | LensesVisO : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
28 | LensesVisO vis nms p = case p.info.cons of
29 | [c] => Right (lenses c.args)
30 | _ => Left "Lenses can only be derived for record types"
32 | lenses : Vect n Arg -> List TopLevel
34 | map (\x => TL (lclaim vis p x) (ldef x)) (boundArgs regularNamed args []) <>> []
38 | LensesO : List Name -> ParamTypeInfo -> Res (List TopLevel)
39 | LensesO = LensesVisO Public
43 | LensesVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
44 | LensesVis = LensesVisO defaultOptions
48 | Lenses : List Name -> ParamTypeInfo -> Res (List TopLevel)
49 | Lenses = LensesVis Public