purescript-bridge-0.3.0.0: src/Language/PureScript/Bridge/TypeInfo.hs
{-# LANGUAGE OverloadedStrings #-}
module Language.PureScript.Bridge.TypeInfo where
import Data.Text (Text)
import qualified Data.Text as T
import Data.Proxy
import Data.Typeable
-- Translates a Haskell type info to a PureScript type info:
type TypeBridge = TypeInfo -> Maybe TypeInfo
-- Basic info about a data type:
data TypeInfo = TypeInfo {
-- | Hackage package
typePackage :: !Text
-- | Full Module path
, typeModule :: !Text
, typeName :: !Text
, typeParameters :: ![TypeInfo]
} deriving (Eq, Show)
mkTypeInfo :: Typeable t => Proxy t -> TypeInfo
mkTypeInfo = mkTypeInfo' . typeRep
mkTypeInfo' :: TypeRep -> TypeInfo
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)
}
-- | Put the TypeInfo in a list together with all its typeParameters (recursively)
flattenTypeInfo :: TypeInfo -> [TypeInfo]
flattenTypeInfo t = t : concatMap flattenTypeInfo (typeParameters t)
-- Little helper for type bridge implementers
eqTypeName :: Text -> TypeInfo -> Bool
eqTypeName name = (== name) . typeName