2 | import Derive.Prelude
4 | %language ElabReflection
8 | data SumEncoding : Type where
23 | UntaggedValue : SumEncoding
28 | ObjectWithSingleField : SumEncoding
33 | TwoElemArray : SumEncoding
44 | TaggedObject : (tagFieldName : String)
45 | -> (contentsFieldName : String)
48 | %runElab derive "SumEncoding" [Show,Eq]
52 | defaultTaggedObject : SumEncoding
53 | defaultTaggedObject = TaggedObject "tag" "contents"
56 | record Options where
57 | constructor MkOptions
67 | replaceMissingKeysWithNull : Bool
71 | unwrapRecords : Bool
75 | constructorTagModifier : String -> String
79 | fieldNameModifier : String -> String
82 | defaultOptions : Options
83 | defaultOptions = MkOptions defaultTaggedObject True False True id id
86 | fieldName : Named a => Options -> a -> String
87 | fieldName o v = o.fieldNameModifier v.nameStr
90 | fieldNamePrim : Named a => Options -> a -> TTImp
91 | fieldNamePrim o v = primVal (Str $
fieldName o v)
94 | constructorTag : Named a => Options -> a -> String
95 | constructorTag o v = o.constructorTagModifier v.nameStr
98 | constructorTagPrim : Named a => Options -> a -> TTImp
99 | constructorTagPrim o v = primVal (Str $
constructorTag o v)
106 | data ArgInfo : Type where
108 | Fields : SnocList (BoundArg 2 RegularNamed) -> ArgInfo
109 | Values : SnocList (BoundArg 2 Regular) -> ArgInfo
120 | argInfo : SnocList (BoundArg 2 Regular) -> ArgInfo
121 | argInfo [<] = Const
122 | argInfo sx = maybe (Values sx) Fields $
traverse toNamed sx
125 | isConst : DCon -> Bool
126 | isConst (DC _ _ _ _ Const) = True
130 | toRegular : BoundArg n RegularNamed -> BoundArg n Regular
131 | toRegular (BA arg vars prf) = BA arg vars %search
134 | dcon : Options -> Con n vs -> DCon
136 | let xs := freshNames "x" c.arty
137 | ys := freshNames "y" c.arty
139 | ac := `(Right
~(applyCon c xs))
140 | sx := boundArgs regular c.args [xs,ys]
141 | tag := constructorTagPrim o c
142 | in DC c.name bc ac tag $
argInfo sx