module Database.Record.KeyConstraint (
ColumnConstraint, index, unsafeSpecifyColumnConstraint,
Unique, UniqueColumnConstraint,
NotNull, NotNullColumnConstraint,
Primary, PrimaryColumnConstraint,
KeyConstraint, indexes, unsafeSpecifyKeyConstraint,
UniqueConstraint, PrimaryConstraint,
uniqueColumn, notNullColumn,
leftColumnConstraint,
unsafeSpecifyNotNullValue,
deriveComposite,
unique,
HasColumnConstraint (columnConstraint),
derivedUniqueColumnConstraint,
derivedNotNullColumnConstraint,
HasKeyConstraint (keyConstraint),
derivedCompositePrimary,
derivedUniqueConstraint
) where
newtype ColumnConstraint c r = ColumnConstraint Int
index :: ColumnConstraint c r -> Int
index (ColumnConstraint i) = i
data Unique
data NotNull
data Primary
type UniqueColumnConstraint = ColumnConstraint Unique
type NotNullColumnConstraint = ColumnConstraint NotNull
type PrimaryColumnConstraint = ColumnConstraint Primary
unsafeSpecifyColumnConstraint :: Int
-> ColumnConstraint c r
unsafeSpecifyColumnConstraint = ColumnConstraint
uniqueColumn :: PrimaryColumnConstraint r -> UniqueColumnConstraint r
uniqueColumn = unsafeSpecifyColumnConstraint . index
notNullColumn :: PrimaryColumnConstraint r -> NotNullColumnConstraint r
notNullColumn = unsafeSpecifyColumnConstraint . index
leftColumnConstraint :: ColumnConstraint NotNull a -> ColumnConstraint NotNull (a, b)
leftColumnConstraint pa = ColumnConstraint (index pa)
class HasColumnConstraint c a where
columnConstraint :: ColumnConstraint c a
instance HasColumnConstraint NotNull a => HasColumnConstraint NotNull (a, b) where
columnConstraint = leftColumnConstraint columnConstraint
derivedUniqueColumnConstraint :: HasColumnConstraint Primary r => UniqueColumnConstraint r
derivedUniqueColumnConstraint = uniqueColumn columnConstraint
derivedNotNullColumnConstraint :: HasColumnConstraint Primary r => NotNullColumnConstraint r
derivedNotNullColumnConstraint = notNullColumn columnConstraint
unsafeSpecifyNotNullValue :: NotNullColumnConstraint a
unsafeSpecifyNotNullValue = unsafeSpecifyColumnConstraint 0
newtype KeyConstraint c r = KeyConstraint [Int]
indexes :: KeyConstraint c r -> [Int]
indexes (KeyConstraint is) = is
unsafeSpecifyKeyConstraint :: [Int]
-> KeyConstraint c r
unsafeSpecifyKeyConstraint = KeyConstraint
deriveComposite :: ColumnConstraint c r -> KeyConstraint c r
deriveComposite = unsafeSpecifyKeyConstraint . (:[]) . index
type UniqueConstraint = KeyConstraint Unique
type PrimaryConstraint = KeyConstraint Primary
unique :: PrimaryConstraint r -> UniqueConstraint r
unique = unsafeSpecifyKeyConstraint . indexes
class HasKeyConstraint c a where
keyConstraint :: KeyConstraint c a
derivedCompositeConstraint :: HasColumnConstraint c r => KeyConstraint c r
derivedCompositeConstraint = deriveComposite columnConstraint
derivedCompositePrimary :: HasColumnConstraint Primary r => PrimaryConstraint r
derivedCompositePrimary = derivedCompositeConstraint
derivedUniqueConstraint :: HasKeyConstraint Primary r => UniqueConstraint r
derivedUniqueConstraint = unique keyConstraint