@@ -263,14 +263,23 @@ jsonDecls g p (Map.toList -> rs) = [from, to]
265 decode (l, s)
265 decode (l, s)
266+ | _additional s = app (var "parseJSON") (app (var "Object") (var "o"))
266 | Just x <- def s = defJS l x
267 | Just x <- def s = defJS l x
267 | required s = reqJS l
268 | required s = reqJS l
268 | monoid s = defJS l (var "mempty")
269 | monoid s = defJS l (var "mempty")
269 | otherwise = optJS l
270 | otherwise = optJS l
273+ [(k, v)] | _additional v ->
271− to = InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
274+ InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
276+ infixApp (var "toJSON") "." (var (fname p k))
280+ InstDecl noLoc Nothing [] [] (unqual "ToJSON") [tycon g]
272− [ wildcardD "toJSON" g omit none (map encode rs)
281+ [ wildcardD "toJSON" g omit none (map encode rs)
275 omit = app (var "object")
284 omit = app (var "object")
276 . app (var "catMaybes")
285 . app (var "catMaybes")
@@ -420,13 +429,17 @@ externalType = \case
420 TMaybe t -> TyApp (TyCon "Maybe") (externalType t)
429 TMaybe t -> TyApp (TyCon "Maybe") (externalType t)
421 TList t -> TyList (externalType t)
430 TList t -> TyList (externalType t)
422 TLit l -> externalLit l
431 TLit l -> externalLit l
433+ TyApp (TyApp (TyCon "HashMap") (externalType k)) (externalType (require v))
424internalType :: TType -> Type
435internalType :: TType -> Type
425internalType = \case
436internalType = \case
426− TType r -> tycon r
437+ TType r -> tycon r
427− TMaybe t -> TyApp (TyCon "Maybe") (internalType t)
438+ TMaybe t -> TyApp (TyCon "Maybe") (internalType t)
428− TList t -> TyList (internalType t)
439+ TList t -> TyList (internalType t)
429− TLit l -> internalLit l
440+ TLit l -> internalLit l
442+ TyApp (TyApp (TyCon "HashMap") (internalType k)) (internalType (require v))
431externalLit :: Lit -> Type
444externalLit :: Lit -> Type
432externalLit = \case
445externalLit = \case
@@ -490,6 +503,10 @@ iso = \case
490 TLit DateTime -> Just (var "_DateTime")
503 TLit DateTime -> Just (var "_DateTime")
491 _ -> Nothing
504 _ -> Nothing
506+require :: TType -> TType
507+require (TMaybe t) = t
493strict :: Type -> Type
510strict :: Type -> Type
494strict = TyBang BangedTy . \case
511strict = TyBang BangedTy . \case
495 t@TyApp{} -> TyParen t
512 t@TyApp{} -> TyParen t