0 | module Derive.Integral
2 | import Language.Reflection.Util
11 | dvClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
13 | let arg := p.applied
14 | tpe := piAll `(~(arg) -> ~(arg) -> ~(arg)) (allImplicits p "Integral")
15 | in simpleClaim vis fun tpe
18 | intImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
19 | intImplClaim v impl p = implClaimVis v impl (implType "Integral" p)
25 | intImplDef : (div, mod, impl : Name) -> Decl
26 | intImplDef d m impl =
27 | def impl [patClause (var impl) (appNames "MkIntegral" [d,m])]
29 | parameters (nms : List Name)
30 | div : BoundArg 2 Explicit -> TTImp
31 | div (BA arg [x,y] _) = `(div
~(var x) ~(var y))
33 | mod : BoundArg 2 Explicit -> TTImp
34 | mod (BA arg [x,y] _) = `(mod
~(var x) ~(var y))
37 | divDef : Name -> Con n vs -> Decl
39 | let clause := mapArgs2 explicit (\x,y => `(~(var fun) ~(x) ~(y))) div c
43 | modDef : Name -> Con n vs -> Decl
45 | let clause := mapArgs2 explicit (\x,y => `(~(var fun) ~(x) ~(y))) mod c
55 | IntegralVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
56 | IntegralVis vis nms p = case p.info.cons of
58 | let div := funName p "div"
59 | mod := funName p "mod"
60 | impl := implName p "Integral"
62 | [ TL (dvClaim vis div p) (divDef nms div c)
63 | , TL (dvClaim vis mod p) (modDef nms mod c)
64 | , TL (intImplClaim vis impl p) (intImplDef div mod impl)
66 | _ => failRecord "Integral"
70 | Integral : List Name -> ParamTypeInfo -> Res (List TopLevel)
71 | Integral = IntegralVis Public