{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
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 c r -> Int
index (ColumnConstraint i :: Int
i) = Int
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 :: Int -> ColumnConstraint c r
unsafeSpecifyColumnConstraint = Int -> ColumnConstraint c r
forall c r. Int -> ColumnConstraint c r
ColumnConstraint
uniqueColumn :: PrimaryColumnConstraint r -> UniqueColumnConstraint r
uniqueColumn :: PrimaryColumnConstraint r -> UniqueColumnConstraint r
uniqueColumn = Int -> UniqueColumnConstraint r
forall c r. Int -> ColumnConstraint c r
unsafeSpecifyColumnConstraint (Int -> UniqueColumnConstraint r)
-> (PrimaryColumnConstraint r -> Int)
-> PrimaryColumnConstraint r
-> UniqueColumnConstraint r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimaryColumnConstraint r -> Int
forall c r. ColumnConstraint c r -> Int
index
notNullColumn :: PrimaryColumnConstraint r -> NotNullColumnConstraint r
notNullColumn :: PrimaryColumnConstraint r -> NotNullColumnConstraint r
notNullColumn = Int -> NotNullColumnConstraint r
forall c r. Int -> ColumnConstraint c r
unsafeSpecifyColumnConstraint (Int -> NotNullColumnConstraint r)
-> (PrimaryColumnConstraint r -> Int)
-> PrimaryColumnConstraint r
-> NotNullColumnConstraint r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimaryColumnConstraint r -> Int
forall c r. ColumnConstraint c r -> Int
index
leftColumnConstraint :: ColumnConstraint NotNull a -> ColumnConstraint NotNull (a, b)
leftColumnConstraint :: ColumnConstraint NotNull a -> ColumnConstraint NotNull (a, b)
leftColumnConstraint pa :: ColumnConstraint NotNull a
pa = Int -> ColumnConstraint NotNull (a, b)
forall c r. Int -> ColumnConstraint c r
ColumnConstraint (ColumnConstraint NotNull a -> Int
forall c r. ColumnConstraint c r -> Int
index ColumnConstraint NotNull a
pa)
class HasColumnConstraint c a where
columnConstraint :: ColumnConstraint c a
instance HasColumnConstraint NotNull a => HasColumnConstraint NotNull (a, b) where
columnConstraint :: ColumnConstraint NotNull (a, b)
columnConstraint = ColumnConstraint NotNull a -> ColumnConstraint NotNull (a, b)
forall a b.
ColumnConstraint NotNull a -> ColumnConstraint NotNull (a, b)
leftColumnConstraint ColumnConstraint NotNull a
forall c a. HasColumnConstraint c a => ColumnConstraint c a
columnConstraint
derivedUniqueColumnConstraint :: HasColumnConstraint Primary r => UniqueColumnConstraint r
derivedUniqueColumnConstraint :: UniqueColumnConstraint r
derivedUniqueColumnConstraint = PrimaryColumnConstraint r -> UniqueColumnConstraint r
forall r. PrimaryColumnConstraint r -> UniqueColumnConstraint r
uniqueColumn PrimaryColumnConstraint r
forall c a. HasColumnConstraint c a => ColumnConstraint c a
columnConstraint
derivedNotNullColumnConstraint :: HasColumnConstraint Primary r => NotNullColumnConstraint r
derivedNotNullColumnConstraint :: NotNullColumnConstraint r
derivedNotNullColumnConstraint = PrimaryColumnConstraint r -> NotNullColumnConstraint r
forall r. PrimaryColumnConstraint r -> NotNullColumnConstraint r
notNullColumn PrimaryColumnConstraint r
forall c a. HasColumnConstraint c a => ColumnConstraint c a
columnConstraint
unsafeSpecifyNotNullValue :: NotNullColumnConstraint a
unsafeSpecifyNotNullValue :: NotNullColumnConstraint a
unsafeSpecifyNotNullValue = Int -> NotNullColumnConstraint a
forall c r. Int -> ColumnConstraint c r
unsafeSpecifyColumnConstraint 0
newtype KeyConstraint c r = KeyConstraint [Int]
indexes :: KeyConstraint c r -> [Int]
indexes :: KeyConstraint c r -> [Int]
indexes (KeyConstraint is :: [Int]
is) = [Int]
is
unsafeSpecifyKeyConstraint :: [Int]
-> KeyConstraint c r
unsafeSpecifyKeyConstraint :: [Int] -> KeyConstraint c r
unsafeSpecifyKeyConstraint = [Int] -> KeyConstraint c r
forall c r. [Int] -> KeyConstraint c r
KeyConstraint
deriveComposite :: ColumnConstraint c r -> KeyConstraint c r
deriveComposite :: ColumnConstraint c r -> KeyConstraint c r
deriveComposite = [Int] -> KeyConstraint c r
forall c r. [Int] -> KeyConstraint c r
unsafeSpecifyKeyConstraint ([Int] -> KeyConstraint c r)
-> (ColumnConstraint c r -> [Int])
-> ColumnConstraint c r
-> KeyConstraint c r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:[]) (Int -> [Int])
-> (ColumnConstraint c r -> Int) -> ColumnConstraint c r -> [Int]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ColumnConstraint c r -> Int
forall c r. ColumnConstraint c r -> Int
index
type UniqueConstraint = KeyConstraint Unique
type PrimaryConstraint = KeyConstraint Primary
unique :: PrimaryConstraint r -> UniqueConstraint r
unique :: PrimaryConstraint r -> UniqueConstraint r
unique = [Int] -> UniqueConstraint r
forall c r. [Int] -> KeyConstraint c r
unsafeSpecifyKeyConstraint ([Int] -> UniqueConstraint r)
-> (PrimaryConstraint r -> [Int])
-> PrimaryConstraint r
-> UniqueConstraint r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimaryConstraint r -> [Int]
forall c r. KeyConstraint c r -> [Int]
indexes
class HasKeyConstraint c a where
keyConstraint :: KeyConstraint c a
derivedCompositeConstraint :: HasColumnConstraint c r => KeyConstraint c r
derivedCompositeConstraint :: KeyConstraint c r
derivedCompositeConstraint = ColumnConstraint c r -> KeyConstraint c r
forall c r. ColumnConstraint c r -> KeyConstraint c r
deriveComposite ColumnConstraint c r
forall c a. HasColumnConstraint c a => ColumnConstraint c a
columnConstraint
derivedCompositePrimary :: HasColumnConstraint Primary r => PrimaryConstraint r
derivedCompositePrimary :: PrimaryConstraint r
derivedCompositePrimary = PrimaryConstraint r
forall c r. HasColumnConstraint c r => KeyConstraint c r
derivedCompositeConstraint
derivedUniqueConstraint :: HasKeyConstraint Primary r => UniqueConstraint r
derivedUniqueConstraint :: UniqueConstraint r
derivedUniqueConstraint = PrimaryConstraint r -> UniqueConstraint r
forall r. PrimaryConstraint r -> UniqueConstraint r
unique PrimaryConstraint r
forall c a. HasKeyConstraint c a => KeyConstraint c a
keyConstraint