0 | module Derive.ApplicativeB
2 | import Language.Reflection.Util
3 | import Derive.BarbieInfo
11 | bpureTpe : (k : TTImp) -> TTImp -> TTImp
14 | {0 f : ~(k) -> Type}
15 | -> ((0 a : ~(k)) -> f a
)
19 | bprodTpe : (k : TTImp) -> TTImp -> TTImp
22 | {0 f,g : ~(k) -> Type}
25 | -> ~(arg) (\x => Pair
(f x
) (g x
))
29 | bpureClaim : Visibility -> (fun : Name) -> (p : BarbieInfo) -> Decl
30 | bpureClaim vis fun p =
31 | simpleClaim vis fun $
piAll (bpureTpe p.kind p.applied) p.implicits
34 | bprodClaim : Visibility -> (fun : Name) -> (p : BarbieInfo) -> Decl
35 | bprodClaim vis fun p =
36 | simpleClaim vis fun $
piAll (bprodTpe p.kind p.applied) p.implicits
41 | applicativeImplClaim : Visibility -> (impl : Name) -> (p : BarbieInfo) -> Decl
42 | applicativeImplClaim vis impl p =
43 | let tpe := piAll `(ApplicativeB
~(p.kind) ~(p.applied)) p.implicits
44 | in implClaimVis vis impl tpe
51 | applicativeImplDef : (bpure, bprod, impl : Name) -> Decl
52 | applicativeImplDef bpure bprod impl =
53 | def impl [patClause (var impl) `(MkApplicativeB
~(var bpure) ~(var bprod))]
55 | prodArg : BoundArg 2 Regular -> TTImp
56 | prodArg (BA g [x,y] _) = `(MkPair
~(var x) ~(var y))
59 | prodClause : (fun : Name) -> Con n vs -> Clause
61 | mapArgs2 regular (\x,y => `(~(var f) ~(x) ~(y))) prodArg
64 | prodDef : Name -> Con n vs -> Decl
65 | prodDef fun c = def fun [prodClause fun c]
68 | pureDef : Name -> Con n vs -> Decl
70 | let rhs := injArgs explicit (const `(fun
_)) c
71 | in def f [patClause `(~(var f) fun
) rhs]
80 | ApplicativeBVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
81 | ApplicativeBVis vis nms p = case barbieArgs p.info.args of
82 | Just prf => case p.info.cons of
84 | let npure := funName p "bpure"
85 | nprod := funName p "bprod"
86 | impl := implName p "ApplicativeB"
89 | [ TL (bpureClaim vis npure bti) (pureDef npure c)
90 | , TL (bprodClaim vis nprod bti) (prodDef nprod c)
91 | , TL (applicativeImplClaim vis impl bti)
92 | (applicativeImplDef npure nprod impl)
94 | _ => failRecord "ApplicativeB"
95 | Nothing => Left $
"Not a barbie type"
99 | ApplicativeB : List Name -> ParamTypeInfo -> Res (List TopLevel)
100 | ApplicativeB = ApplicativeBVis Public