{-# LANGUAGE RecordWildCards #-}
module Text.Layout.Table.Spec.TableSpec where

import Data.Default.Class

import Text.Layout.Table.Spec.ColSpec
import Text.Layout.Table.Spec.HeaderSpec
import Text.Layout.Table.Spec.RowGroup
import Text.Layout.Table.Style

-- | Type used to specify tables.
data TableSpec rowSep colSep r c a
    = TableSpec
    { forall rowSep colSep r c a.
TableSpec rowSep colSep r c a -> [ColSpec]
colSpecs :: [ColSpec]
    -- ^ Layout specification of the columns
    , forall rowSep colSep r c a.
TableSpec rowSep colSep r c a -> TableStyle rowSep colSep
tableStyle :: TableStyle rowSep colSep
    -- ^ The style of the table
    , forall rowSep colSep r c a.
TableSpec rowSep colSep r c a -> HeaderSpec rowSep r
rowHeader :: HeaderSpec rowSep r
    -- ^ Specification of the row header
    , forall rowSep colSep r c a.
TableSpec rowSep colSep r c a -> HeaderSpec colSep c
colHeader :: HeaderSpec colSep c
    -- ^ Specification of the column header
    , forall rowSep colSep r c a.
TableSpec rowSep colSep r c a -> [RowGroup a]
rowGroups :: [RowGroup a]
    -- ^ A list of visually separated rows
    }

-- | Specify a table with the style and the row groups.
simpleTableS
    :: (Default rowSep, Default colSep)
    => TableStyle rowSep colSep
    -> [RowGroup a]
    -> TableSpec rowSep colSep String String a
simpleTableS :: forall rowSep colSep a.
(Default rowSep, Default colSep) =>
TableStyle rowSep colSep
-> [RowGroup a] -> TableSpec rowSep colSep String String a
simpleTableS = [ColSpec]
-> TableStyle rowSep colSep
-> [RowGroup a]
-> TableSpec rowSep colSep String String a
forall rowSep colSep a.
(Default rowSep, Default colSep) =>
[ColSpec]
-> TableStyle rowSep colSep
-> [RowGroup a]
-> TableSpec rowSep colSep String String a
headerlessTableS ([ColSpec]
 -> TableStyle rowSep colSep
 -> [RowGroup a]
 -> TableSpec rowSep colSep String String a)
-> [ColSpec]
-> TableStyle rowSep colSep
-> [RowGroup a]
-> TableSpec rowSep colSep String String a
forall a b. (a -> b) -> a -> b
$ ColSpec -> [ColSpec]
forall a. a -> [a]
repeat ColSpec
defColSpec

-- | Specify a table with the columns, the style, and the row groups.
headerlessTableS
    :: (Default rowSep, Default colSep)
    => [ColSpec]
    -> TableStyle rowSep colSep
    -> [RowGroup a]
    -> TableSpec rowSep colSep String String a
headerlessTableS :: forall rowSep colSep a.
(Default rowSep, Default colSep) =>
[ColSpec]
-> TableStyle rowSep colSep
-> [RowGroup a]
-> TableSpec rowSep colSep String String a
headerlessTableS [ColSpec]
colSpecs TableStyle rowSep colSep
tableStyle [RowGroup a]
rowGroups = TableSpec :: forall rowSep colSep r c a.
[ColSpec]
-> TableStyle rowSep colSep
-> HeaderSpec rowSep r
-> HeaderSpec colSep c
-> [RowGroup a]
-> TableSpec rowSep colSep r c a
TableSpec { [ColSpec]
[RowGroup a]
HeaderSpec rowSep String
HeaderSpec colSep String
TableStyle rowSep colSep
colHeader :: HeaderSpec colSep String
rowHeader :: HeaderSpec rowSep String
rowGroups :: [RowGroup a]
tableStyle :: TableStyle rowSep colSep
colSpecs :: [ColSpec]
rowGroups :: [RowGroup a]
colHeader :: HeaderSpec colSep String
rowHeader :: HeaderSpec rowSep String
tableStyle :: TableStyle rowSep colSep
colSpecs :: [ColSpec]
.. }
  where
    rowHeader :: HeaderSpec rowSep String
rowHeader = HeaderSpec rowSep String
forall sep. Default sep => HeaderSpec sep String
noneH
    colHeader :: HeaderSpec colSep String
colHeader = HeaderSpec colSep String
forall sep. Default sep => HeaderSpec sep String
noneH

-- | Specify a table without a row header.
columnHeaderTableS
    :: Default rowSep
    => [ColSpec]
    -> TableStyle rowSep colSep
    -> HeaderSpec colSep c
    -> [RowGroup a]
    -> TableSpec rowSep colSep String c a
columnHeaderTableS :: forall rowSep colSep c a.
Default rowSep =>
[ColSpec]
-> TableStyle rowSep colSep
-> HeaderSpec colSep c
-> [RowGroup a]
-> TableSpec rowSep colSep String c a
columnHeaderTableS [ColSpec]
colSpecs TableStyle rowSep colSep
tableStyle HeaderSpec colSep c
colHeader [RowGroup a]
rowGroups = TableSpec :: forall rowSep colSep r c a.
[ColSpec]
-> TableStyle rowSep colSep
-> HeaderSpec rowSep r
-> HeaderSpec colSep c
-> [RowGroup a]
-> TableSpec rowSep colSep r c a
TableSpec { [ColSpec]
[RowGroup a]
HeaderSpec rowSep String
HeaderSpec colSep c
TableStyle rowSep colSep
rowHeader :: HeaderSpec rowSep String
rowGroups :: [RowGroup a]
colHeader :: HeaderSpec colSep c
tableStyle :: TableStyle rowSep colSep
colSpecs :: [ColSpec]
rowGroups :: [RowGroup a]
colHeader :: HeaderSpec colSep c
rowHeader :: HeaderSpec rowSep String
tableStyle :: TableStyle rowSep colSep
colSpecs :: [ColSpec]
.. }
  where
    rowHeader :: HeaderSpec rowSep String
rowHeader = HeaderSpec rowSep String
forall sep. Default sep => HeaderSpec sep String
noneH

-- | Specify a table with everything.
fullTableS
    :: [ColSpec]
    -> TableStyle rowSep colSep
    -> HeaderSpec rowSep r
    -> HeaderSpec colSep c
    -> [RowGroup a]
    -> TableSpec rowSep colSep r c a
fullTableS :: forall rowSep colSep r c a.
[ColSpec]
-> TableStyle rowSep colSep
-> HeaderSpec rowSep r
-> HeaderSpec colSep c
-> [RowGroup a]
-> TableSpec rowSep colSep r c a
fullTableS = [ColSpec]
-> TableStyle rowSep colSep
-> HeaderSpec rowSep r
-> HeaderSpec colSep c
-> [RowGroup a]
-> TableSpec rowSep colSep r c a
forall rowSep colSep r c a.
[ColSpec]
-> TableStyle rowSep colSep
-> HeaderSpec rowSep r
-> HeaderSpec colSep c
-> [RowGroup a]
-> TableSpec rowSep colSep r c a
TableSpec