-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Type-safe datatype-database mapping library.
--   
--   This library helps to generate instances for Groundhog datatypes.
@package groundhog-th
@version 0.8.0.2

module Database.Groundhog.TH.Settings
data PersistDefinitions
PersistDefinitions :: [PSEntityDef] -> [PSEmbeddedDef] -> [PSPrimitiveDef] -> PersistDefinitions
[psEntities] :: PersistDefinitions -> [PSEntityDef]
[psEmbeddeds] :: PersistDefinitions -> [PSEmbeddedDef]
[psPrimitives] :: PersistDefinitions -> [PSPrimitiveDef]
data THEntityDef
THEntityDef :: Name -> String -> Maybe String -> Maybe THAutoKeyDef -> [THUniqueKeyDef] -> [TyVarBndr] -> [THConstructorDef] -> THEntityDef
[thDataName] :: THEntityDef -> Name
[thDbEntityName] :: THEntityDef -> String
[thEntitySchema] :: THEntityDef -> Maybe String
[thAutoKey] :: THEntityDef -> Maybe THAutoKeyDef
[thUniqueKeys] :: THEntityDef -> [THUniqueKeyDef]
[thTypeParams] :: THEntityDef -> [TyVarBndr]
[thConstructors] :: THEntityDef -> [THConstructorDef]
data THEmbeddedDef
THEmbeddedDef :: Name -> Name -> String -> [TyVarBndr] -> [THFieldDef] -> THEmbeddedDef
[thEmbeddedName] :: THEmbeddedDef -> Name
[thEmbeddedConstructorName] :: THEmbeddedDef -> Name

-- | It is used only to set polymorphic part of name of its container
[thDbEmbeddedName] :: THEmbeddedDef -> String
[thEmbeddedTypeParams] :: THEmbeddedDef -> [TyVarBndr]
[thEmbeddedFields] :: THEmbeddedDef -> [THFieldDef]
data THPrimitiveDef
THPrimitiveDef :: Name -> String -> Name -> THPrimitiveDef
[thPrimitiveName] :: THPrimitiveDef -> Name

-- | It is used only to set polymorphic part of name of its container
[thPrimitiveDbName] :: THPrimitiveDef -> String

-- | Name of a pair of functions converting the value to and from a type
--   that is an instance of <tt>PrimitivePersistField</tt>
[thPrimitiveConverter] :: THPrimitiveDef -> Name
data THConstructorDef
THConstructorDef :: Name -> String -> String -> Maybe String -> [THFieldDef] -> [THUniqueDef] -> THConstructorDef
[thConstrName] :: THConstructorDef -> Name
[thPhantomConstrName] :: THConstructorDef -> String
[thDbConstrName] :: THConstructorDef -> String
[thDbAutoKeyName] :: THConstructorDef -> Maybe String
[thConstrFields] :: THConstructorDef -> [THFieldDef]
[thConstrUniques] :: THConstructorDef -> [THUniqueDef]
data THFieldDef
THFieldDef :: String -> String -> Maybe String -> String -> Type -> Maybe [PSFieldDef String] -> Maybe String -> Maybe (Maybe ((Maybe String, String), [String]), Maybe ReferenceActionType, Maybe ReferenceActionType) -> Maybe Name -> THFieldDef

-- | name in the record, bar
[thFieldName] :: THFieldDef -> String

-- | column name, SQLbar
[thDbFieldName] :: THFieldDef -> String

-- | column type, inet, NUMERIC(5, 2), VARCHAR(50), etc.
[thDbTypeName] :: THFieldDef -> Maybe String

-- | name of constructor in the Field GADT, BarField
[thExprName] :: THFieldDef -> String
[thFieldType] :: THFieldDef -> Type
[thEmbeddedDef] :: THFieldDef -> Maybe [PSFieldDef String]

-- | default value in the database
[thDefaultValue] :: THFieldDef -> Maybe String
[thReferenceParent] :: THFieldDef -> Maybe (Maybe ((Maybe String, String), [String]), Maybe ReferenceActionType, Maybe ReferenceActionType)

-- | name of a pair of functions
[thFieldConverter] :: THFieldDef -> Maybe Name
data THUniqueDef
THUniqueDef :: String -> UniqueType -> [Either String String] -> THUniqueDef
[thUniqueName] :: THUniqueDef -> String
[thUniqueType] :: THUniqueDef -> UniqueType

-- | Either name of field, i.e, thFieldName, or expression
[thUniqueFields] :: THUniqueDef -> [Either String String]
data THUniqueKeyDef
THUniqueKeyDef :: String -> String -> String -> String -> [THFieldDef] -> Bool -> Bool -> THUniqueKeyDef
[thUniqueKeyName] :: THUniqueKeyDef -> String
[thUniqueKeyPhantomName] :: THUniqueKeyDef -> String
[thUniqueKeyConstrName] :: THUniqueKeyDef -> String

-- | It is used only to set polymorphic part of name of its container | It
--   should repeat fields from THUniqueDef but it may give different
--   settings for them. It is done to allow foreign key fields to be
--   different from parent fields of the entity. These fields are used for
--   creating a the key constructor and instances for it. For example, it
--   can have a default value, or even a different type (INT8 may reference
--   INT4).
[thUniqueKeyDbName] :: THUniqueKeyDef -> String
[thUniqueKeyFields] :: THUniqueKeyDef -> [THFieldDef]

-- | If True, make it an instance of Embedded
[thUniqueKeyMakeEmbedded] :: THUniqueKeyDef -> Bool
[thUniqueKeyIsDef] :: THUniqueKeyDef -> Bool
data THAutoKeyDef
THAutoKeyDef :: String -> Bool -> THAutoKeyDef
[thAutoKeyConstrName] :: THAutoKeyDef -> String
[thAutoKeyIsDef] :: THAutoKeyDef -> Bool
data PSEntityDef
PSEntityDef :: String -> Maybe String -> Maybe String -> Maybe (Maybe PSAutoKeyDef) -> Maybe [PSUniqueKeyDef] -> Maybe [PSConstructorDef] -> PSEntityDef
[psDataName] :: PSEntityDef -> String
[psDbEntityName] :: PSEntityDef -> Maybe String
[psEntitySchema] :: PSEntityDef -> Maybe String
[psAutoKey] :: PSEntityDef -> Maybe (Maybe PSAutoKeyDef)
[psUniqueKeys] :: PSEntityDef -> Maybe [PSUniqueKeyDef]
[psConstructors] :: PSEntityDef -> Maybe [PSConstructorDef]
data PSEmbeddedDef
PSEmbeddedDef :: String -> Maybe String -> Maybe [PSFieldDef String] -> PSEmbeddedDef
[psEmbeddedName] :: PSEmbeddedDef -> String

-- | It is used only to set polymorphic part of name of its container
[psDbEmbeddedName] :: PSEmbeddedDef -> Maybe String
[psEmbeddedFields] :: PSEmbeddedDef -> Maybe [PSFieldDef String]
data PSPrimitiveDef
PSPrimitiveDef :: String -> Maybe String -> String -> PSPrimitiveDef
[psPrimitiveName] :: PSPrimitiveDef -> String

-- | It is used only to set polymorphic part of name of its container
[psPrimitiveDbName] :: PSPrimitiveDef -> Maybe String

-- | Name of a pair of functions converting the value to and from a type
--   that is an instance of <tt>PrimitivePersistField</tt>
[psPrimitiveConverter] :: PSPrimitiveDef -> String
data PSConstructorDef
PSConstructorDef :: String -> Maybe String -> Maybe String -> Maybe String -> Maybe [PSFieldDef String] -> Maybe [PSUniqueDef] -> PSConstructorDef
[psConstrName] :: PSConstructorDef -> String
[psPhantomConstrName] :: PSConstructorDef -> Maybe String
[psDbConstrName] :: PSConstructorDef -> Maybe String
[psDbAutoKeyName] :: PSConstructorDef -> Maybe String
[psConstrFields] :: PSConstructorDef -> Maybe [PSFieldDef String]
[psConstrUniques] :: PSConstructorDef -> Maybe [PSUniqueDef]
data PSFieldDef str :: * -> *
PSFieldDef :: str -> Maybe str -> Maybe str -> Maybe str -> Maybe [PSFieldDef str] -> Maybe str -> Maybe (Maybe ((Maybe str, str), [str]), Maybe ReferenceActionType, Maybe ReferenceActionType) -> Maybe str -> PSFieldDef str

-- | name in the record, bar
[psFieldName] :: PSFieldDef str -> str

-- | column name, SQLbar
[psDbFieldName] :: PSFieldDef str -> Maybe str

-- | column type, inet, NUMERIC(5, 2), VARCHAR(50), etc.
[psDbTypeName] :: PSFieldDef str -> Maybe str

-- | name of constructor in the Field GADT, BarField
[psExprName] :: PSFieldDef str -> Maybe str
[psEmbeddedDef] :: PSFieldDef str -> Maybe [PSFieldDef str]

-- | default value in the database
[psDefaultValue] :: PSFieldDef str -> Maybe str
[psReferenceParent] :: PSFieldDef str -> Maybe (Maybe ((Maybe str, str), [str]), Maybe ReferenceActionType, Maybe ReferenceActionType)

-- | name of a pair of functions
[psFieldConverter] :: PSFieldDef str -> Maybe str
data PSUniqueDef
PSUniqueDef :: String -> Maybe UniqueType -> [Either String String] -> PSUniqueDef
[psUniqueName] :: PSUniqueDef -> String
[psUniqueType] :: PSUniqueDef -> Maybe UniqueType
[psUniqueFields] :: PSUniqueDef -> [Either String String]
data PSUniqueKeyDef
PSUniqueKeyDef :: String -> Maybe String -> Maybe String -> Maybe String -> Maybe [PSFieldDef String] -> Maybe Bool -> Maybe Bool -> PSUniqueKeyDef
[psUniqueKeyName] :: PSUniqueKeyDef -> String
[psUniqueKeyPhantomName] :: PSUniqueKeyDef -> Maybe String
[psUniqueKeyConstrName] :: PSUniqueKeyDef -> Maybe String
[psUniqueKeyDbName] :: PSUniqueKeyDef -> Maybe String
[psUniqueKeyFields] :: PSUniqueKeyDef -> Maybe [PSFieldDef String]
[psUniqueKeyMakeEmbedded] :: PSUniqueKeyDef -> Maybe Bool
[psUniqueKeyIsDef] :: PSUniqueKeyDef -> Maybe Bool
data PSAutoKeyDef
PSAutoKeyDef :: Maybe String -> Maybe Bool -> PSAutoKeyDef
[psAutoKeyConstrName] :: PSAutoKeyDef -> Maybe String
[psAutoKeyIsDef] :: PSAutoKeyDef -> Maybe Bool
instance GHC.Show.Show Database.Groundhog.TH.Settings.PersistDefinitions
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSEntityDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSEntityDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSAutoKeyDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSAutoKeyDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSUniqueKeyDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSUniqueKeyDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSConstructorDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSConstructorDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSUniqueDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSUniqueDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSPrimitiveDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSPrimitiveDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.PSEmbeddedDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.PSEmbeddedDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THEntityDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THEntityDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THUniqueKeyDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THUniqueKeyDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THConstructorDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THConstructorDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THUniqueDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THUniqueDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THEmbeddedDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THEmbeddedDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THFieldDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THFieldDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THPrimitiveDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THPrimitiveDef
instance GHC.Show.Show Database.Groundhog.TH.Settings.THAutoKeyDef
instance GHC.Classes.Eq Database.Groundhog.TH.Settings.THAutoKeyDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PersistDefinitions
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PersistDefinitions
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSEntityDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSEntityDef
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.TH.Settings.PSEntityDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSAutoKeyDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSAutoKeyDef
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.TH.Settings.PSAutoKeyDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSUniqueKeyDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSUniqueKeyDef
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.TH.Settings.PSUniqueKeyDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSConstructorDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSConstructorDef
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.TH.Settings.PSConstructorDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSUniqueDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSUniqueDef
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.TH.Settings.PSUniqueDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSPrimitiveDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSPrimitiveDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.TH.Settings.PSEmbeddedDef
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.TH.Settings.PSEmbeddedDef
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.Core.UniqueType
instance Language.Haskell.TH.Syntax.Lift Database.Groundhog.Core.ReferenceActionType
instance Language.Haskell.TH.Syntax.Lift (Database.Groundhog.Generic.PSFieldDef GHC.Base.String)
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.Core.UniqueType
instance Data.Aeson.Types.FromJSON.FromJSON Database.Groundhog.Core.ReferenceActionType
instance Data.Aeson.Types.FromJSON.FromJSON (Database.Groundhog.Generic.PSFieldDef GHC.Base.String)
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.Core.UniqueType
instance Data.Aeson.Types.ToJSON.ToJSON Database.Groundhog.Core.ReferenceActionType
instance Data.Aeson.Types.ToJSON.ToJSON (Database.Groundhog.Generic.PSFieldDef GHC.Base.String)

module Database.Groundhog.TH.CodeGen
mkEmbeddedPersistFieldInstance :: THEmbeddedDef -> Q [Dec]
mkEmbeddedPurePersistFieldInstance :: THEmbeddedDef -> Q [Dec]
mkEmbeddedInstance :: THEmbeddedDef -> Q [Dec]
mkEntityPhantomConstructors :: THEntityDef -> Q [Dec]
mkEntityPhantomConstructorInstances :: THEntityDef -> Q [Dec]
mkEntityUniqueKeysPhantoms :: THEntityDef -> Q [Dec]
mkAutoKeyPersistFieldInstance :: THEntityDef -> Q [Dec]
mkAutoKeyPrimitivePersistFieldInstance :: THEntityDef -> Q [Dec]
mkUniqueKeysIsUniqueInstances :: THEntityDef -> Q [Dec]
mkUniqueKeysEmbeddedInstances :: THEntityDef -> Q [Dec]
mkUniqueKeysPersistFieldInstances :: THEntityDef -> Q [Dec]
mkUniqueKeysPrimitiveOrPurePersistFieldInstances :: THEntityDef -> Q [Dec]
mkKeyEqShowInstances :: THEntityDef -> Q [Dec]
mkEntityPersistFieldInstance :: THEntityDef -> Q [Dec]
mkEntitySinglePersistFieldInstance :: THEntityDef -> Q [Dec]
mkPersistEntityInstance :: THEntityDef -> Q [Dec]
mkEntityNeverNullInstance :: THEntityDef -> Q [Dec]
mkPrimitivePersistFieldInstance :: THPrimitiveDef -> Q [Dec]
mkPrimitivePrimitivePersistFieldInstance :: THPrimitiveDef -> Q [Dec]
mkMigrateFunction :: String -> [THEntityDef] -> Q [Dec]


-- | This module provides functions to generate the auxiliary structures
--   for the user data type
module Database.Groundhog.TH

-- | Creates the auxiliary structures. Particularly, it creates GADT
--   <tt>Field</tt> data instance for referring to the fields in
--   expressions and phantom types for data constructors. The default names
--   of auxiliary datatypes and names used in database are generated using
--   the naming style and can be changed via configuration. The datatypes
--   and their generation options are defined via YAML configuration parsed
--   by quasiquoter <a>groundhog</a>.
mkPersist :: CodegenConfig -> PersistDefinitions -> Q [Dec]

-- | Converts quasiquoted settings into the datatype used by mkPersist.
groundhog :: QuasiQuoter

-- | Parses configuration stored in the file
--   
--   <pre>
--   mkPersist defaultCodegenConfig [groundhogFile|../groundhog.yaml|]
--   </pre>
groundhogFile :: QuasiQuoter
data CodegenConfig
CodegenConfig :: NamingStyle -> Maybe String -> [[THEntityDef] -> Q [Dec]] -> [[THEmbeddedDef] -> Q [Dec]] -> [[THPrimitiveDef] -> Q [Dec]] -> CodegenConfig

-- | Naming style that is applied for all definitions
[namingStyle] :: CodegenConfig -> NamingStyle

-- | Codegenerator will create a function with this name that will run
--   <tt>migrate</tt> for each non-polymorphic entity in definition
[migrationFunction] :: CodegenConfig -> Maybe String

-- | Functions that produce Haskell code for the entities. In most cases
--   when overriding, the default functions that produce mappings are not
--   replaced but kept along with custom code. Example:
--   <tt>[<a>defaultMkEntityDecs</a>, mkMyDecs]</tt>.
[mkEntityDecs] :: CodegenConfig -> [[THEntityDef] -> Q [Dec]]
[mkEmbeddedDecs] :: CodegenConfig -> [[THEmbeddedDef] -> Q [Dec]]
[mkPrimitiveDecs] :: CodegenConfig -> [[THPrimitiveDef] -> Q [Dec]]
defaultCodegenConfig :: CodegenConfig
defaultMkEntityDecs :: [THEntityDef] -> Q [Dec]
defaultMkEmbeddedDecs :: [THEmbeddedDef] -> Q [Dec]
defaultMkPrimitiveDecs :: [THPrimitiveDef] -> Q [Dec]

-- | Defines how the names are created. The mk* functions correspond to the
--   set* functions. Functions mkNormal* define names of non-record
--   constructor Field
data NamingStyle
NamingStyle :: (String -> String) -> (String -> String) -> (String -> String -> Int -> String) -> (String -> String -> String -> String) -> (String -> String -> String -> String) -> (String -> String -> String -> String) -> (String -> String -> Int -> String) -> (String -> String -> Int -> String) -> (String -> String -> Int -> String -> Int -> String) -> (String -> String -> Int -> String -> Int -> String) -> (String -> String -> String -> Int -> String) -> (String -> String -> Int -> Int -> String) -> (String -> String -> Int -> Int -> String) -> (String -> String -> Int -> Int -> String) -> (String -> String -> Int -> String) -> NamingStyle

-- | Create name of the table for the datatype. Parameters: data name.
[mkDbEntityName] :: NamingStyle -> String -> String

-- | Create name of the backend-specific key constructor for the datatype.
--   Parameters: data name.
[mkEntityKeyName] :: NamingStyle -> String -> String

-- | Create name for phantom constructor used to parametrise
--   <tt>Field</tt>. Parameters: data name, constructor name, constructor
--   position.
[mkPhantomName] :: NamingStyle -> String -> String -> Int -> String

-- | Create name for phantom unique key used to parametrise <tt>Key</tt>.
--   Parameters: data name, constructor name, unique constraint name.
[mkUniqueKeyPhantomName] :: NamingStyle -> String -> String -> String -> String

-- | Create name of constructor for the unique key. Parameters: data name,
--   constructor name, unique constraint name.
[mkUniqueKeyConstrName] :: NamingStyle -> String -> String -> String -> String

-- | Create name used by <tt>persistName</tt> for the unique key.
--   Parameters: data name, constructor name, unique constraint name.
[mkUniqueKeyDbName] :: NamingStyle -> String -> String -> String -> String

-- | Create name of the constructor specific table. Parameters: data name,
--   constructor name, constructor position.
[mkDbConstrName] :: NamingStyle -> String -> String -> Int -> String

-- | Create name of the db field for autokey. Parameters: data name,
--   constructor name, constructor position.
[mkDbConstrAutoKeyName] :: NamingStyle -> String -> String -> Int -> String

-- | Create name of the field column in a database. Parameters: data name,
--   constructor name, constructor position, field record name, field
--   position.
[mkDbFieldName] :: NamingStyle -> String -> String -> Int -> String -> Int -> String

-- | Create name of field constructor used in expressions. Parameters: data
--   name, constructor name, constructor position, field record name, field
--   position.
[mkExprFieldName] :: NamingStyle -> String -> String -> Int -> String -> Int -> String

-- | Create name of selector (see <tt>Embedded</tt>) constructor used in
--   expressions. Parameters: data name, constructor name, field record
--   name, field position.
[mkExprSelectorName] :: NamingStyle -> String -> String -> String -> Int -> String

-- | Create field name used to refer to the it in settings for non-record
--   constructors. Parameters: data name, constructor name, constructor
--   position, field position.
[mkNormalFieldName] :: NamingStyle -> String -> String -> Int -> Int -> String

-- | Create name of the field column in a database. Parameters: data name,
--   constructor name, constructor position, field position.
[mkNormalDbFieldName] :: NamingStyle -> String -> String -> Int -> Int -> String

-- | Create name of field constructor used in expressions. Parameters: data
--   name, constructor name, constructor position, field position.
[mkNormalExprFieldName] :: NamingStyle -> String -> String -> Int -> Int -> String

-- | Create name of selector (see <tt>Embedded</tt>) constructor used in
--   expressions. Parameters: data name, constructor name, field position.
[mkNormalExprSelectorName] :: NamingStyle -> String -> String -> Int -> String

-- | Default style. Adds "Field" to each record field name.
--   
--   Example:
--   
--   <pre>
--   data SomeData a = Normal Int | Record { bar :: Maybe String, asc :: a}
--   -- Generated code
--   data NormalConstructor
--   data RecordConstructor
--   instance PersistEntity where
--     data Field (SomeData a) where
--       Normal0Field :: Field NormalConstructor Int
--       BarField :: Field RecordConstructor (Maybe String)
--       AscField :: Field RecordConstructor a
--   ...
--   </pre>
suffixNamingStyle :: NamingStyle

-- | Creates field names in Persistent fashion prepending constructor names
--   to the fields.
--   
--   Example:
--   
--   <pre>
--   data SomeData a = Normal Int | Record { bar :: Maybe String, asc :: a}
--   -- Generated code
--   data NormalConstructor
--   data RecordConstructor
--   instance PersistEntity where
--     data Field (SomeData a) where
--       Normal0 :: Field NormalConstructor Int
--       RecordBar :: Field RecordConstructor (Maybe String)
--       RecordAsc :: Field RecordConstructor a
--   ...
--   </pre>
persistentNamingStyle :: NamingStyle

-- | Creates the shortest field names. It is more likely to lead in name
--   conflicts than other naming styles.
--   
--   Example:
--   
--   <pre>
--   data SomeData a = Normal Int | Record { bar :: Maybe String, asc :: a}
--   -- Generated code
--   data NormalConstructor
--   data RecordConstructor
--   instance PersistEntity where
--     data Field (SomeData a) where
--       Normal0 :: Field NormalConstructor Int
--       Bar :: Field RecordConstructor (Maybe String)
--       Asc :: Field RecordConstructor a
--   ...
--   </pre>
conciseNamingStyle :: NamingStyle

-- | The generated Haskell names of phantom types (constructors, fields,
--   etc.) are the same as with suffixNamingStyle. But the table names and
--   columns are converted from camelCase to underscore_lower_case with
--   <a>toUnderscore</a>.
lowerCaseSuffixNamingStyle :: NamingStyle

-- | Transforms string from camelCase to lower_case_underscore naming
--   convention. ColumnName -&gt; column_name, parseURL -&gt; parse_url,
--   FieldIEEE754Floating -&gt; field_ieee754_floating
toUnderscore :: String -> String
firstChar :: (Char -> Char) -> String -> String
mkTHEntityDef :: NamingStyle -> Dec -> THEntityDef
mkTHEmbeddedDef :: NamingStyle -> Dec -> THEmbeddedDef
mkTHPrimitiveDef :: NamingStyle -> Dec -> THPrimitiveDef
applyEntitySettings :: NamingStyle -> PSEntityDef -> THEntityDef -> THEntityDef
applyEmbeddedSettings :: PSEmbeddedDef -> THEmbeddedDef -> THEmbeddedDef
applyPrimitiveSettings :: PSPrimitiveDef -> THPrimitiveDef -> THPrimitiveDef
showReadConverter :: (Show a, Read a) => (a -> String, String -> a)
enumConverter :: Enum a => (a -> Int, Int -> a)
