2 | import Language.Reflection.Util
11 | neutralClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
12 | neutralClaim vis fun p =
13 | let arg := p.applied
14 | tpe := piAll arg (allImplicits p "Monoid")
15 | in simpleClaim vis fun tpe
20 | monoidImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
21 | monoidImplClaim v impl p = implClaimVis v impl (implType "Monoid" p)
28 | monoidImplDef : (fun, impl : Name) -> Decl
29 | monoidImplDef f i = def i [patClause (var i) (var "MkMonoid" `app` var f)]
31 | rhs : Con n vs -> TTImp
32 | rhs = injArgs explicit (const `(neutral
))
37 | neutralDef : Name -> Con n vs -> Decl
38 | neutralDef f c = def f [patClause (var f) (rhs c)]
46 | MonoidVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
47 | MonoidVis vis nms p = case p.info.cons of
49 | let fun := funName p "neutral"
50 | impl := implName p "Monoid"
52 | [ TL (neutralClaim vis fun p) (neutralDef fun c)
53 | , TL (monoidImplClaim vis impl p) (monoidImplDef fun impl)
55 | _ => failRecord "Monoid"
59 | Monoid : List Name -> ParamTypeInfo -> Res (List TopLevel)
60 | Monoid = MonoidVis Public