2 | import public Derive.Lens.Options
3 | import public Language.Reflection.Util
7 | parameters (o : LensOptions)
9 | pname n = UN $
Basic (o.constructorName $
nameStr n)
11 | pclaim : Visibility -> ParamTypeInfo -> Name -> TTImp -> Decl
12 | pclaim vis p con rtpe =
13 | let arg := p.applied
14 | tpe := piAll `(Prism'
~(arg) ~(rtpe)) p.implicits
15 | in simpleClaim vis (pname con) tpe
17 | pdef0 : Name -> Decl
19 | let nme := pname con
20 | get := `(\case ~(var con) => Just ();
_ => Nothing
)
21 | in def nme [patClause (var nme) `(prism'
(const
~(var con)) ~(get))]
23 | pdef1 : Name -> Decl
25 | let nme := pname con
26 | get := `(\case ~(var con) x
=> Just x;
_ => Nothing
)
27 | in def nme [patClause (var nme) `(prism'
~(var con) ~(get))]
29 | ptl : Visibility -> ParamTypeInfo -> Con n vs -> Maybe TopLevel
30 | ptl vis p (MkCon con _ args _) = case boundArgs regular args [] of
31 | [<] => Just (TL (pclaim vis p con `(Unit
)) (pdef0 con))
32 | [<arg] => Just (TL (pclaim vis p con arg.arg.type) (pdef1 con))
37 | PrismsVisO : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
38 | PrismsVisO vis nms p = Right $
mapMaybe (ptl vis p) p.info.cons
42 | PrismsO : List Name -> ParamTypeInfo -> Res (List TopLevel)
43 | PrismsO = PrismsVisO Public
47 | PrismsVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
48 | PrismsVis = PrismsVisO defaultOptions
52 | Prisms : List Name -> ParamTypeInfo -> Res (List TopLevel)
53 | Prisms = PrismsVis Public