-- |
-- Module      : Database.Relational.Internal.UntypedTable
-- Copyright   : 2013-2017 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- This module defines no-phantom table type which has table metadatas.
module Database.Relational.Internal.UntypedTable (
  Untyped (Untyped), name', width', columns', (!),
  ) where

import Data.Array (Array, elems)
import qualified Data.Array as Array

import Database.Relational.Internal.String (StringSQL)


-- | Untyped typed table type
data Untyped = Untyped String Int (Array Int StringSQL)  deriving Int -> Untyped -> ShowS
[Untyped] -> ShowS
Untyped -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Untyped] -> ShowS
$cshowList :: [Untyped] -> ShowS
show :: Untyped -> String
$cshow :: Untyped -> String
showsPrec :: Int -> Untyped -> ShowS
$cshowsPrec :: Int -> Untyped -> ShowS
Show

-- | Name string of table in SQL
name' :: Untyped -> String
name' :: Untyped -> String
name'       (Untyped String
n Int
_ Array Int StringSQL
_) = String
n

-- | Width of table
width' :: Untyped -> Int
width' :: Untyped -> Int
width'      (Untyped String
_ Int
w Array Int StringSQL
_) = Int
w

-- | Column name strings in SQL
columnArray :: Untyped -> Array Int StringSQL
columnArray :: Untyped -> Array Int StringSQL
columnArray (Untyped String
_ Int
_ Array Int StringSQL
c) = Array Int StringSQL
c

-- | Column name strings in SQL
columns' :: Untyped -> [StringSQL]
columns' :: Untyped -> [StringSQL]
columns' =  forall i e. Array i e -> [e]
elems forall b c a. (b -> c) -> (a -> b) -> a -> c
. Untyped -> Array Int StringSQL
columnArray

-- | Column name string in SQL specified by index
(!) :: Untyped
    -> Int       -- ^ Column index
    -> StringSQL -- ^ Column name String in SQL
Untyped
t ! :: Untyped -> Int -> StringSQL
! Int
i = Untyped -> Array Int StringSQL
columnArray Untyped
t forall i e. Ix i => Array i e -> i -> e
Array.! Int
i