module Sqel.Column where

import Sqel.Class.Mods (AddMod (addMod), MapMod, amendMod)
import Sqel.Data.Dd (Dd (Dd), DdK (DdK), Struct (Prim))
import Sqel.Data.Mods (Nullable (Nullable), PgDefault (PgDefault), PrimaryKey (PrimaryKey), SetTableName (SetTableName))
import Sqel.Data.PgTypeName (PgTableName)
import Sqel.Data.Sql (Sql)
import Sqel.Names.Rename (Rename, rename)
import Sqel.Names.Set (SetName)

pk ::
  AddMod PrimaryKey s0 s1 =>
  Dd s0 ->
  Dd s1
pk :: forall (s0 :: DdK) (s1 :: DdK).
AddMod PrimaryKey s0 s1 =>
Dd s0 -> Dd s1
pk =
  forall p (s0 :: DdK) (s1 :: DdK).
AddMod p s0 s1 =>
p -> Dd s0 -> Dd s1
addMod PrimaryKey
PrimaryKey

class MkNullable s0 s1 | s0 -> s1 where
  mkNullable :: Dd s0 -> Dd s1

instance MkNullable ('DdK sel p a 'Prim) ('DdK sel p (Maybe a) 'Prim) where
  mkNullable :: Dd ('DdK sel p a 'Prim) -> Dd ('DdK sel p (Maybe a) 'Prim)
mkNullable (Dd SelW sel
sel Mods mods
p DdStruct s1
s) = forall (sel :: Sel) (mods :: [*]) (s1 :: Struct) a.
SelW sel -> Mods mods -> DdStruct s1 -> Dd ('DdK sel mods a s1)
Dd SelW sel
sel Mods mods
p DdStruct s1
s

nullable ::
   s0 s1 s2 .
  AddMod Nullable s0 s1 =>
  MkNullable s1 s2 =>
  Dd s0 ->
  Dd s2
nullable :: forall (s0 :: DdK) (s1 :: DdK) (s2 :: DdK).
(AddMod Nullable s0 s1, MkNullable s1 s2) =>
Dd s0 -> Dd s2
nullable =
  forall (s0 :: DdK) (s1 :: DdK). MkNullable s0 s1 => Dd s0 -> Dd s1
mkNullable forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall p (s0 :: DdK) (s1 :: DdK).
AddMod p s0 s1 =>
p -> Dd s0 -> Dd s1
addMod Nullable
Nullable

nullableAs ::
   name s0 s1 s2 .
  AddMod Nullable s0 s1 =>
  MkNullable s1 s2 =>
  Rename s2 (SetName s2 name) =>
  Dd s0 ->
  Dd (SetName s2 name)
nullableAs :: forall (name :: Symbol) (s0 :: DdK) (s1 :: DdK) (s2 :: DdK).
(AddMod Nullable s0 s1, MkNullable s1 s2,
 Rename s2 (SetName s2 name)) =>
Dd s0 -> Dd (SetName s2 name)
nullableAs =
  forall (s0 :: DdK) (s1 :: DdK). Rename s0 s1 => Dd s0 -> Dd s1
rename forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (s0 :: DdK) (s1 :: DdK) (s2 :: DdK).
(AddMod Nullable s0 s1, MkNullable s1 s2) =>
Dd s0 -> Dd s2
nullable

tableName ::
   s0 s1 .
  MapMod SetTableName s0 s1 =>
  PgTableName ->
  Dd s0 ->
  Dd s1
tableName :: forall (s0 :: DdK) (s1 :: DdK).
MapMod SetTableName s0 s1 =>
PgTableName -> Dd s0 -> Dd s1
tableName PgTableName
name =
  forall p (s0 :: DdK) (s1 :: DdK).
MapMod p s0 s1 =>
p -> Dd s0 -> Dd s1
amendMod (PgTableName -> SetTableName
SetTableName PgTableName
name)

pgDefault ::
  AddMod PgDefault s0 s1 =>
  Sql ->
  Dd s0 ->
  Dd s1
pgDefault :: forall (s0 :: DdK) (s1 :: DdK).
AddMod PgDefault s0 s1 =>
Sql -> Dd s0 -> Dd s1
pgDefault Sql
v =
  forall p (s0 :: DdK) (s1 :: DdK).
AddMod p s0 s1 =>
p -> Dd s0 -> Dd s1
addMod (Sql -> PgDefault
PgDefault Sql
v)