module Language.PureScript.Bridge.TypeInfo (
TypeInfo (..)
, PSType
, HaskellType
, mkTypeInfo
, mkTypeInfo'
, Language (..)
, typePackage
, typeModule
, typeName
, typeParameters
, HasHaskType
, haskType
, flattenTypeInfo
) where
import Control.Lens
import Data.Proxy
import Data.Text (Text)
import qualified Data.Text as T
import Data.Typeable
data Language = Haskell | PureScript
data TypeInfo (lang :: Language) = TypeInfo {
_typePackage :: !Text
, _typeModule :: !Text
, _typeName :: !Text
, _typeParameters :: ![TypeInfo lang]
} deriving (Eq, Ord, Show)
makeLenses ''TypeInfo
type PSType = TypeInfo 'PureScript
type HaskellType = TypeInfo 'Haskell
class HasHaskType t where
haskType :: Lens' t HaskellType
instance HasHaskType HaskellType where
haskType inj = inj
mkTypeInfo :: Typeable t => Proxy t -> HaskellType
mkTypeInfo = mkTypeInfo' . typeRep
mkTypeInfo' :: TypeRep -> HaskellType
mkTypeInfo' rep = let
con = typeRepTyCon rep
in TypeInfo {
_typePackage = T.pack $ tyConPackage con
, _typeModule = T.pack $ tyConModule con
, _typeName = T.pack $ tyConName con
, _typeParameters = map mkTypeInfo' (typeRepArgs rep)
}
flattenTypeInfo :: TypeInfo lang -> [TypeInfo lang]
flattenTypeInfo t = t : concatMap flattenTypeInfo (_typeParameters t)