0 | module Derive.Fractional
2 | import Language.Reflection.Util
11 | divClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
12 | divClaim vis fun p =
13 | let arg := p.applied
14 | tpe := piAll `(~(arg) -> ~(arg) -> ~(arg)) (allImplicits p "Fractional")
15 | in simpleClaim vis fun tpe
18 | recipClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
19 | recipClaim vis fun p =
20 | let arg := p.applied
21 | tpe := piAll `(~(arg) -> ~(arg)) (allImplicits p "Fractional")
22 | in simpleClaim vis fun tpe
25 | fractionalImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
26 | fractionalImplClaim v i p = implClaimVis v i (implType "Fractional" p)
32 | fractionalImplDef : (div, recip, impl : Name) -> Decl
33 | fractionalImplDef d r i =
34 | def i [patClause (var i) (appNames "MkFractional" [d, r])]
36 | div : BoundArg 2 Explicit -> TTImp
37 | div (BA arg [x,y] _) = `(~(var x) /
~(var y))
39 | recip : BoundArg 1 Explicit -> TTImp
40 | recip (BA arg [x] _) = `(recip
~(var x))
43 | divDef : Name -> Con n vs -> Decl
45 | let clause := mapArgs2 explicit (\x,y => `(~(var fun) ~(x) ~(y))) div c
49 | recipDef : Name -> Con n vs -> Decl
51 | let clause := mapArgs explicit (var fun `app`) recip c
61 | FractionalVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
62 | FractionalVis vis nms p = case p.info.cons of
64 | let recip := funName p "recip"
65 | div := funName p "divide"
66 | impl := implName p "Fractional"
68 | [ TL (recipClaim vis recip p) (recipDef recip c)
69 | , TL (divClaim vis div p) (divDef div c)
70 | , TL (fractionalImplClaim vis impl p) (fractionalImplDef div recip impl)
72 | _ => failRecord "Fractional"
76 | Fractional : List Name -> ParamTypeInfo -> Res (List TopLevel)
77 | Fractional = FractionalVis Public