Skip to content

Commit b61824c

Browse files
committed
add parent types / generic instances for unary records
1 parent f6e51e4 commit b61824c

File tree

1 file changed

+13
-4
lines changed
  • src/Data/Aeson/TypeScript

1 file changed

+13
-4
lines changed

src/Data/Aeson/TypeScript/TH.hs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,22 @@ deriveTypeScript options name = do
190190
case (unwrapUnaryRecords options, datatypeCons) of
191191
(True, [con]) | RecordConstructor [_name] <- constructorVariant con -> do
192192
let [fld] = constructorFields con
193-
let getTypeFn = FunD 'getTypeScriptType [Clause [WildP] (NormalB (AppE (VarE 'getTypeScriptType) (SigE (ConE 'Proxy) (AppT (ConT ''Proxy) fld)))) []]
194-
let getParentTypesFn = FunD 'getParentTypes [Clause [WildP] (NormalB (ListE [AppE (ConE 'TSType) (SigE (ConE 'Proxy) (AppT (ConT ''Proxy) fld))])) []]
193+
let getNonGenericTypeFn = FunD 'getTypeScriptType [Clause [WildP] (NormalB (getTypeAsStringExp fld)) []]
194+
let getGenericTypeFn = if null datatypeVars
195+
then getNonGenericTypeFn
196+
else FunD 'getTypeScriptType [Clause [WildP] (NormalB (getTypeAsStringExp (foldl AppT (ConT name) templateVarsToUse))) []]
197+
getGenericParentTypesFn <- getGenericParentTypesExpression fullyQualifiedDatatypeInfo >>= \expr -> return $ FunD 'getParentTypes [Clause [WildP] (NormalB expr) []]
198+
getNonGenericParentTypesFn <- getNonGenericParentTypesExpression fullyQualifiedDatatypeInfo >>= \expr -> return $ FunD 'getParentTypes [Clause [WildP] (NormalB expr) []]
199+
let fullyGenericInstance = mkInstance [] (AppT (ConT ''TypeScript) (ConT name)) [getGenericTypeFn, getGenericParentTypesFn]
200+
otherInstances <- if null datatypeVars
201+
then return []
202+
else
195203
#if MIN_VERSION_th_abstraction(0,3,0)
196-
return [mkInstance (fmap getDatatypePredicate datatypeInstTypes) (AppT (ConT ''TypeScript) (foldl AppT (ConT name) datatypeInstTypes)) [getTypeFn, getParentTypesFn]]
204+
return [mkInstance (fmap getDatatypePredicate datatypeInstTypes) (AppT (ConT ''TypeScript) (foldl AppT (ConT name) datatypeInstTypes)) [getNonGenericTypeFn, getNonGenericParentTypesFn]]
197205
#else
198-
return [mkInstance (fmap getDatatypePredicate datatypeVars) (AppT (ConT ''TypeScript) (foldl AppT (ConT name) datatypeVars)) [getTypeFn, getParentTypesFn]]
206+
return [mkInstance (fmap getDatatypePredicate datatypeVars) (AppT (ConT ''TypeScript) (foldl AppT (ConT name) datatypeVars)) [getNonGenericTypeFn, getNonGenericParentTypesFn]]
199207
#endif
208+
return (fullyGenericInstance : otherInstances)
200209
_ -> do
201210
typeExpr <- getTypeExpression fullyQualifiedDatatypeInfo
202211
let getTypeFn = FunD 'getTypeScriptType [Clause [WildP] (NormalB typeExpr) []]

0 commit comments

Comments
 (0)