0 | module Derive.Semigroup
2 | import Language.Reflection.Util
13 | appClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
14 | appClaim vis fun p =
15 | let arg := p.applied
16 | tpe := piAll `(~(arg) -> ~(arg) -> ~(arg)) (allImplicits p "Semigroup")
17 | in simpleClaim vis fun tpe
22 | semigroupImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
23 | semigroupImplClaim v impl p = implClaimVis v impl (implType "Semigroup" p)
30 | semigroupImplDef : (fun, impl : Name) -> Decl
31 | semigroupImplDef f i =
32 | def i [patClause (var i) (var "MkSemigroup" `app` var f)]
34 | app : BoundArg 2 Explicit -> TTImp
35 | app (BA _ [x,y] _) = `(~(var x) <+>
~(var y))
37 | appClause : Name -> Con n vs -> Clause
38 | appClause f = mapArgs2 explicit (\x,y => `(~(var f) ~(x) ~(y))) app
41 | appDef : Name -> Con n vs -> Decl
42 | appDef f c = def f [appClause f c]
50 | SemigroupVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
51 | SemigroupVis vis nms p = case p.info.cons of
53 | let fun := funName p "append"
54 | impl := implName p "Semigroup"
56 | [ TL (appClaim vis fun p) (appDef fun c)
57 | , TL (semigroupImplClaim vis impl p) (semigroupImplDef fun impl)
59 | _ => failRecord "Semigroup"
63 | Semigroup : List Name -> ParamTypeInfo -> Res (List TopLevel)
64 | Semigroup = SemigroupVis Public