2 | import public Derive.Lens.Options
3 | import public Language.Reflection.Util
7 | isoErr : Either String a
8 | isoErr = Left "Isomorphisms can only be derived for newtypes"
10 | parameters (o : LensOptions)
11 | iname : ParamTypeInfo -> Name
12 | iname p = UN $
Basic (o.dataTypeName $
nameStr p.info.name)
14 | iclaim : Visibility -> ParamTypeInfo -> Name -> TTImp -> Decl
15 | iclaim vis p con rtpe =
16 | let arg := p.applied
17 | tpe := piAll `(Iso'
~(arg) ~(rtpe)) p.implicits
18 | in simpleClaim vis (iname p) tpe
20 | idef : ParamTypeInfo -> Name -> Decl
23 | get := `(\case ~(var con) x
=> x
)
24 | in def nme [patClause (var nme) `(iso
~(get) ~(var con))]
26 | itl : Visibility -> ParamTypeInfo -> Con n vs -> Res (List TopLevel)
27 | itl vis p (MkCon con _ args _) = case boundArgs regular args [] of
28 | [<arg] => Right [TL (iclaim vis p con arg.arg.type) (idef p con)]
33 | IsoVisO : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
34 | IsoVisO vis nms p = case p.info.cons of
40 | IsoO : List Name -> ParamTypeInfo -> Res (List TopLevel)
41 | IsoO = IsoVisO Public
45 | IsoVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
46 | IsoVis = IsoVisO defaultOptions
50 | Iso : List Name -> ParamTypeInfo -> Res (List TopLevel)