{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Aeson.TypeScript.Instances where
import qualified Data.Aeson as A
import Data.Aeson.TypeScript.Types
import Data.Data
import Data.HashMap.Strict
import Data.HashSet
import qualified Data.List as L
import Data.Map.Strict
import Data.Set
import Data.String.Interpolate
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Data.Void
import Data.Word
import GHC.Int
#if !MIN_VERSION_base(4,11,0)
import Data.Monoid
#endif
#if MIN_VERSION_aeson(2,0,0)
import qualified Data.Aeson.KeyMap as A
#endif
instance TypeScript () where
getTypeScriptType :: Proxy () -> [Char]
getTypeScriptType Proxy ()
_ = [Char]
"void"
instance TypeScript Void where
getTypeScriptType :: Proxy Void -> [Char]
getTypeScriptType Proxy Void
_ = [Char]
"void"
instance TypeScript T.Text where
getTypeScriptType :: Proxy Text -> [Char]
getTypeScriptType Proxy Text
_ = [Char]
"string"
instance TypeScript TL.Text where
getTypeScriptType :: Proxy Text -> [Char]
getTypeScriptType Proxy Text
_ = [Char]
"string"
instance TypeScript Integer where
getTypeScriptType :: Proxy Integer -> [Char]
getTypeScriptType Proxy Integer
_ = [Char]
"number"
instance TypeScript Float where
getTypeScriptType :: Proxy Float -> [Char]
getTypeScriptType Proxy Float
_ = [Char]
"number"
instance TypeScript Double where
getTypeScriptType :: Proxy Double -> [Char]
getTypeScriptType Proxy Double
_ = [Char]
"number"
instance TypeScript Bool where
getTypeScriptType :: Proxy Bool -> [Char]
getTypeScriptType Proxy Bool
_ = [Char]
"boolean"
instance TypeScript Int where
getTypeScriptType :: Proxy Int -> [Char]
getTypeScriptType Proxy Int
_ = [Char]
"number"
instance TypeScript Int16 where
getTypeScriptType :: Proxy Int16 -> [Char]
getTypeScriptType Proxy Int16
_ = [Char]
"number"
instance TypeScript Int32 where
getTypeScriptType :: Proxy Int32 -> [Char]
getTypeScriptType Proxy Int32
_ = [Char]
"number"
instance TypeScript Int64 where
getTypeScriptType :: Proxy Int64 -> [Char]
getTypeScriptType Proxy Int64
_ = [Char]
"number"
instance TypeScript Char where
getTypeScriptType :: Proxy Char -> [Char]
getTypeScriptType Proxy Char
_ = [Char]
"string"
instance TypeScript Word8 where
getTypeScriptType :: Proxy Word8 -> [Char]
getTypeScriptType Proxy Word8
_ = [Char]
"number"
instance {-# OVERLAPPABLE #-} (TypeScript a) => TypeScript [a] where
getTypeScriptType :: Proxy [a] -> [Char]
getTypeScriptType Proxy [a]
_ = (forall {k} (a :: k). TypeScript a => Proxy a -> [Char]
getTypeScriptType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)) forall a. [a] -> [a] -> [a]
++ [Char]
"[]"
getParentTypes :: Proxy [a] -> [TSType]
getParentTypes Proxy [a]
_ = [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)]
instance {-# OVERLAPPING #-} TypeScript [Char] where
getTypeScriptType :: Proxy [Char] -> [Char]
getTypeScriptType Proxy [Char]
_ = [Char]
"string"
instance (TypeScript a, TypeScript b) => TypeScript (Either a b) where
getTypeScriptType :: Proxy (Either a b) -> [Char]
getTypeScriptType Proxy (Either a b)
_ = [i|Either<#{getTypeScriptType (Proxy :: Proxy a)}, #{getTypeScriptType (Proxy :: Proxy b)}>|]
getTypeScriptDeclarations :: Proxy (Either a b) -> [TSDeclaration]
getTypeScriptDeclarations Proxy (Either a b)
_ = [[Char] -> [[Char]] -> [[Char]] -> TSDeclaration
TSTypeAlternatives [Char]
"Either" [[Char]
"T1", [Char]
"T2"] [[Char]
"Left<T1>", [Char]
"Right<T2>"]
, [Char] -> [[Char]] -> [TSField] -> TSDeclaration
TSInterfaceDeclaration [Char]
"Left" [[Char]
"T"] [Bool -> [Char] -> [Char] -> TSField
TSField Bool
False [Char]
"Left" [Char]
"T"]
, [Char] -> [[Char]] -> [TSField] -> TSDeclaration
TSInterfaceDeclaration [Char]
"Right" [[Char]
"T"] [Bool -> [Char] -> [Char] -> TSField
TSField Bool
False [Char]
"Right" [Char]
"T"]
]
getParentTypes :: Proxy (Either a b) -> [TSType]
getParentTypes Proxy (Either a b)
_ = forall a. Eq a => [a] -> [a]
L.nub [ (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b))
]
instance (TypeScript a, TypeScript b) => TypeScript (a, b) where
getTypeScriptType :: Proxy (a, b) -> [Char]
getTypeScriptType Proxy (a, b)
_ = [i|[#{getTypeScriptType (Proxy :: Proxy a)}, #{getTypeScriptType (Proxy :: Proxy b)}]|]
getParentTypes :: Proxy (a, b) -> [TSType]
getParentTypes Proxy (a, b)
_ = forall a. Eq a => [a] -> [a]
L.nub [ (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b))
]
instance (TypeScript a, TypeScript b, TypeScript c) => TypeScript (a, b, c) where
getTypeScriptType :: Proxy (a, b, c) -> [Char]
getTypeScriptType Proxy (a, b, c)
_ = [i|[#{getTypeScriptType (Proxy :: Proxy a)}, #{getTypeScriptType (Proxy :: Proxy b)}, #{getTypeScriptType (Proxy :: Proxy c)}]|]
getParentTypes :: Proxy (a, b, c) -> [TSType]
getParentTypes Proxy (a, b, c)
_ = forall a. Eq a => [a] -> [a]
L.nub [ (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy c))
]
instance (TypeScript a, TypeScript b, TypeScript c, TypeScript d) => TypeScript (a, b, c, d) where
getTypeScriptType :: Proxy (a, b, c, d) -> [Char]
getTypeScriptType Proxy (a, b, c, d)
_ = [i|[#{getTypeScriptType (Proxy :: Proxy a)}, #{getTypeScriptType (Proxy :: Proxy b)}, #{getTypeScriptType (Proxy :: Proxy c)}, #{getTypeScriptType (Proxy :: Proxy d)}]|]
getParentTypes :: Proxy (a, b, c, d) -> [TSType]
getParentTypes Proxy (a, b, c, d)
_ = forall a. Eq a => [a] -> [a]
L.nub [ (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy c))
, (forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy d))
]
instance (TypeScript a) => TypeScript (Maybe a) where
getTypeScriptType :: Proxy (Maybe a) -> [Char]
getTypeScriptType Proxy (Maybe a)
_ = forall {k} (a :: k). TypeScript a => Proxy a -> [Char]
getTypeScriptType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)
getTypeScriptOptional :: Proxy (Maybe a) -> Bool
getTypeScriptOptional Proxy (Maybe a)
_ = Bool
True
getParentTypes :: Proxy (Maybe a) -> [TSType]
getParentTypes Proxy (Maybe a)
_ = [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)]
instance TypeScript A.Value where
getTypeScriptType :: Proxy Value -> [Char]
getTypeScriptType Proxy Value
_ = [Char]
"any";
instance (TypeScript a, TypeScript b) => TypeScript (Map a b) where
getTypeScriptType :: Proxy (Map a b) -> [Char]
getTypeScriptType Proxy (Map a b)
_ = [Char]
"{[k in " forall a. [a] -> [a] -> [a]
++ forall {k} (a :: k). TypeScript a => Proxy a -> [Char]
getTypeScriptKeyType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a) forall a. [a] -> [a] -> [a]
++ [Char]
"]?: " forall a. [a] -> [a] -> [a]
++ forall {k} (a :: k). TypeScript a => Proxy a -> [Char]
getTypeScriptType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b) forall a. [a] -> [a] -> [a]
++ [Char]
"}"
getParentTypes :: Proxy (Map a b) -> [TSType]
getParentTypes Proxy (Map a b)
_ = [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a), forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b)]
instance (TypeScript a, TypeScript b) => TypeScript (HashMap a b) where
getTypeScriptType :: Proxy (HashMap a b) -> [Char]
getTypeScriptType Proxy (HashMap a b)
_ = [i|{[k in #{getTypeScriptKeyType (Proxy :: Proxy a)}]?: #{getTypeScriptType (Proxy :: Proxy b)}}|]
getParentTypes :: Proxy (HashMap a b) -> [TSType]
getParentTypes Proxy (HashMap a b)
_ = forall a. Eq a => [a] -> [a]
L.nub [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a), forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy b)]
#if MIN_VERSION_aeson(2,0,0)
instance (TypeScript a) => TypeScript (A.KeyMap a) where
getTypeScriptType :: Proxy (KeyMap a) -> [Char]
getTypeScriptType Proxy (KeyMap a)
_ = [i|{[k: string]: #{getTypeScriptType (Proxy :: Proxy a)}}|]
getParentTypes :: Proxy (KeyMap a) -> [TSType]
getParentTypes Proxy (KeyMap a)
_ = forall a. Eq a => [a] -> [a]
L.nub [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)]
#endif
instance (TypeScript a) => TypeScript (Set a) where
getTypeScriptType :: Proxy (Set a) -> [Char]
getTypeScriptType Proxy (Set a)
_ = forall {k} (a :: k). TypeScript a => Proxy a -> [Char]
getTypeScriptType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a) forall a. Semigroup a => a -> a -> a
<> [Char]
"[]";
getParentTypes :: Proxy (Set a) -> [TSType]
getParentTypes Proxy (Set a)
_ = [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)]
instance (TypeScript a) => TypeScript (HashSet a) where
getTypeScriptType :: Proxy (HashSet a) -> [Char]
getTypeScriptType Proxy (HashSet a)
_ = forall {k} (a :: k). TypeScript a => Proxy a -> [Char]
getTypeScriptType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a) forall a. [a] -> [a] -> [a]
++ [Char]
"[]"
getParentTypes :: Proxy (HashSet a) -> [TSType]
getParentTypes Proxy (HashSet a)
_ = [forall {k} (a :: k).
(Typeable a, TypeScript a) =>
Proxy a -> TSType
TSType (forall {k} (t :: k). Proxy t
Proxy :: Proxy a)]