0 | module Derive.DistributiveB
2 | import Language.Reflection.Util
3 | import Derive.BarbieInfo
11 | bdistTpe : (k : TTImp) -> TTImp -> TTImp
14 | {0 f : Type -> Type}
15 | -> {0 g : ~(k) -> Type}
22 | bdistClaim : Visibility -> (fun : Name) -> (p : BarbieInfo) -> Decl
23 | bdistClaim vis fun p =
24 | simpleClaim vis fun $
piAll (bdistTpe p.kind p.applied) p.implicits
29 | distImplClaim : Visibility -> (impl : Name) -> (p : BarbieInfo) -> Decl
30 | distImplClaim vis impl p =
31 | let tpe := piAll `(DistributiveB
~(p.kind) ~(p.applied)) p.implicits
32 | in implClaimVis vis impl tpe
39 | distImplDef : (fun, impl : Name) -> Decl
40 | distImplDef fun impl =
41 | def impl [patClause (var impl) `(MkDistributiveB
~(var fun))]
43 | rhs : Name -> SnocList TTImp -> TTImp
45 | rhs nm (sx :< x) = rhs nm sx `app` x
47 | arg : BoundArg 0 RegularNamed -> TTImp
48 | arg (BA g [] _) = `(Prelude.map
~(var $
argName g) x_
)
51 | distClause : (fun : Name) -> Con n vs -> Clause
52 | distClause fun c = patClause `(~(var fun) x_
) (injArgs regularNamed arg c)
55 | distDef : Name -> Con n vs -> Decl
56 | distDef fun c = def fun [distClause fun c]
65 | DistributiveBVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
66 | DistributiveBVis vis nms p = case barbieArgs p.info.args of
67 | Just prf => case p.info.cons of
69 | let ndist := funName p "bdist"
70 | impl := implName p "DistributiveB"
73 | [ TL (bdistClaim vis ndist bti) (distDef ndist c)
74 | , TL (distImplClaim vis impl bti) (distImplDef ndist impl)
76 | _ => failRecord "DistributiveB"
77 | Nothing => Left $
"Not a barbie type"
81 | DistributiveB : List Name -> ParamTypeInfo -> Res (List TopLevel)
82 | DistributiveB = DistributiveBVis Public