content: -- |
  -- Module      : Database.Record
  -- Copyright   : 2013 Kei Hibino
  -- License     : BSD3
  --
  -- Maintainer  : ex8k.hibino@gmail.com
  -- Stability   : experimental
  -- Portability : unknown
  --
  -- This is integrated module which contains
  -- types to represent table constraints and
  -- interfaces to bind between SQL database values and Haskell records.
  module Database.Record (
    -- * Concepts
    -- $concepts
  
    -- * Binding between SQL values and Haskell records
    -- $bindSqlAndHaskellRecords
  
    -- * Constraints used for 'RecordFromSql' inference
    -- $constraintsForInference
  
    -- * Modules which provide proof objects
    -- ** Table constraint specified by keys
    module Database.Record.KeyConstraint,
    -- ** Convert between Haskell type and list of SQL type
    module Database.Record.Persistable,
    -- ** Convert from list of SQL type
    module Database.Record.FromSql,
    -- ** Convert into list of SQL type
    module Database.Record.ToSql,
    ) where
  
  import Database.Record.KeyConstraint
    (ColumnConstraint, HasColumnConstraint(..),
     Primary, PrimaryColumnConstraint,
     Unique, UniqueColumnConstraint, uniqueColumn, derivedUniqueColumnConstraint,
     NotNull, NotNullColumnConstraint, notNullColumn, derivedNotNullColumnConstraint,
     KeyConstraint, HasKeyConstraint(..), PrimaryConstraint, UniqueConstraint,
     deriveComposite, unique, derivedCompositePrimary, derivedUniqueConstraint)
  import Database.Record.Persistable
    (PersistableSqlType, PersistableType(..), sqlNullValue,
     PersistableRecordWidth, PersistableWidth(..), derivedWidth)
  import Database.Record.FromSql
    (RecordFromSql, FromSql(..), valueRecordFromSql,
     takeRecord, toRecord)
  import Database.Record.ToSql
    (ToSqlM, RecordToSql, ToSql(..), valueRecordToSql,
     putRecord, putEmpty, fromRecord,
     updateValuesByUnique, updateValuesByPrimary)
  import Database.Record.TupleInstances ()
  
  {- $concepts
  On most drivers for SQL database,
  we need to write or read untyped SQL value sequence
  when accessing databases.
  
  This library maps between list of untyped SQL type
  and Haskell record type using type classes.
  -}
  
  {- $bindSqlAndHaskellRecords
  You will need to implement instances of 'FromSql' and 'ToSql' class
  to bind between SQL database values and Haskell records.
  
  You can use Database.Record.TH module in this package
  to generate instances from SQL database record column names and types.
  -}
  
  {- $constraintsForInference
  You will need to implement instances of
  'HasColumnConstraint' 'NotNull' which is a premise
  to infer 'RecordFromSql' proof object using 'ToSql' 'q' ('Maybe' a) instance.
  This proof object cat convert from SQL type into 'Maybe' typed record
  when dealing with outer joined query.
  -}
  
  {-# ANN module "HLint: ignore Use import/export shortcut" #-}
  