2 | import public Decidable.HDecEq
3 | import Language.Reflection.Util
14 | hdeceqClaim : Visibility -> (fun : Name) -> (p : ParamTypeInfo) -> Decl
15 | hdeceqClaim vis fun p =
16 | let arg := var p.info.name
17 | tpe := `((x : ~(arg)) -> (y : ~(arg)) -> Maybe0
(x === y
))
18 | in simpleClaim vis fun tpe
23 | hdeceqImplClaim : Visibility -> (impl : Name) -> (p : ParamTypeInfo) -> Decl
24 | hdeceqImplClaim vis impl p = implClaimVis vis impl (implType "HDecEq" p)
30 | hdeceqImplDef : (fun, impl : Name) -> Decl
31 | hdeceqImplDef fun impl =
32 | def impl [patClause (var impl) (var "MkHDecEq" `app` var fun)]
36 | catchAll : (fun : Name) -> TypeInfo -> List Clause
38 | if length ti.cons > 1
39 | then [patClause `(~(var fun) _ _) `(Nothing0
)]
47 | hdeceqClauses : (fun : Name) -> TypeInfo -> List Clause
48 | hdeceqClauses fun ti = map clause ti.cons ++ catchAll fun ti
51 | clause : Con ti.arty ti.args -> Clause
54 | in patClause `(~(var fun) ~(v) ~(v)) `(Just0 Refl
)
59 | hdeceqDef : Name -> TypeInfo -> Decl
60 | hdeceqDef fun ti = def fun (hdeceqClauses fun ti)
68 | failEnum = Left "Interface HDecEq can currently only be derived for enumerations"
72 | HDecEqVis : Visibility -> List Name -> ParamTypeInfo -> Res (List TopLevel)
73 | HDecEqVis vis nms p = case isEnum p.info of
75 | let fun := funName p "hdecEq"
76 | impl := implName p "HDecEq"
78 | [ TL (hdeceqClaim vis fun p) (hdeceqDef fun p.info)
79 | , TL (hdeceqImplClaim vis impl p) (hdeceqImplDef fun impl)
85 | HDecEq : List Name -> ParamTypeInfo -> Res (List TopLevel)
86 | HDecEq = HDecEqVis Public