packages feed

sqel-0.0.1.0: lib/Sqel/Data/Term.hs

module Sqel.Data.Term where

import Sqel.Data.Dd (DdInc (DdMerge, DdNest), DdSort (DdCon, DdProd, DdSum))
import Sqel.Data.PgType (PgColumnName, PgPrimName)
import Sqel.Data.PgTypeName (PgTableName)
import Sqel.Data.Sql (Sql)

data ProdType =
  Reg
  |
  Con
  deriving stock (Eq, Show, Generic)

data Comp =
  Prod ProdType
  |
  Sum
  deriving stock (Eq, Show, Generic)

data CompInc =
  Merge
  |
  Nest
  deriving stock (Eq, Show, Generic)

data Struct =
  Prim PgPrimName
  |
  Comp Text Comp CompInc [DdTerm]
  deriving stock (Eq, Show, Generic)

-- TODO would be nice to have a separate type wrapping the root for the table name
data DdTerm =
  DdTerm {
    name :: PgColumnName,
    tableName :: Maybe PgTableName,
    unique :: Bool,
    constraints :: [Sql],
    struct :: Struct
  }
  deriving stock (Eq, Show, Generic)

demoteComp :: DdSort c -> Comp
demoteComp = \case
  DdProd -> Prod Reg
  DdCon -> Prod Con
  DdSum -> Sum

demoteInc :: DdInc i -> CompInc
demoteInc = \case
  DdMerge -> Merge
  DdNest -> Nest