-- | This module provides a primitive styling facility. To make your own style
-- have a look at <https://en.wikipedia.org/wiki/Box-drawing_character>.
module Text.Layout.Table.Style where

-- | Specifies the different letters to construct the non-content structure of a
-- table.
data TableStyle = TableStyle
                { TableStyle -> Char
headerSepH   :: Char
                , TableStyle -> Char
headerSepLC  :: Char
                , TableStyle -> Char
headerSepRC  :: Char
                , TableStyle -> Char
headerSepC   :: Char
                , TableStyle -> Char
headerTopL   :: Char
                , TableStyle -> Char
headerTopR   :: Char
                , TableStyle -> Char
headerTopC   :: Char
                , TableStyle -> Char
headerTopH   :: Char
                , TableStyle -> Char
headerV      :: Char
                , TableStyle -> Char
groupV       :: Char
                , TableStyle -> Char
groupSepH    :: Char
                , TableStyle -> Char
groupSepC    :: Char
                , TableStyle -> Char
groupSepLC   :: Char
                , TableStyle -> Char
groupSepRC   :: Char
                , TableStyle -> Char
groupTopC    :: Char
                , TableStyle -> Char
groupTopL    :: Char
                , TableStyle -> Char
groupTopR    :: Char
                , TableStyle -> Char
groupTopH    :: Char
                , TableStyle -> Char
groupBottomC :: Char
                , TableStyle -> Char
groupBottomL :: Char
                , TableStyle -> Char
groupBottomR :: Char
                , TableStyle -> Char
groupBottomH :: Char
                }

-- | My usual ASCII table style.
asciiRoundS :: TableStyle
asciiRoundS :: TableStyle
asciiRoundS = TableStyle :: Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> TableStyle
TableStyle 
            { headerSepH :: Char
headerSepH   = Char
'='
            , headerSepLC :: Char
headerSepLC  = Char
':'
            , headerSepRC :: Char
headerSepRC  = Char
':'
            , headerSepC :: Char
headerSepC   = Char
':'
            , headerTopL :: Char
headerTopL   = Char
'.'
            , headerTopR :: Char
headerTopR   = Char
'.'
            , headerTopC :: Char
headerTopC   = Char
'.'
            , headerTopH :: Char
headerTopH   = Char
'-'
            , headerV :: Char
headerV      = Char
'|'
            , groupV :: Char
groupV       = Char
'|'
            , groupSepH :: Char
groupSepH    = Char
'-'
            , groupSepC :: Char
groupSepC    = Char
'+'
            , groupSepLC :: Char
groupSepLC   = Char
':'
            , groupSepRC :: Char
groupSepRC   = Char
':'
            , groupTopC :: Char
groupTopC    = Char
'.'
            , groupTopL :: Char
groupTopL    = Char
'.'
            , groupTopR :: Char
groupTopR    = Char
'.'
            , groupTopH :: Char
groupTopH    = Char
'-'
            , groupBottomC :: Char
groupBottomC = Char
'\''
            , groupBottomL :: Char
groupBottomL = Char
'\''
            , groupBottomR :: Char
groupBottomR = Char
'\''
            , groupBottomH :: Char
groupBottomH = Char
'-'
            }

-- | Uses lines and plus for joints.
asciiS :: TableStyle
asciiS :: TableStyle
asciiS = TableStyle :: Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> TableStyle
TableStyle
       { headerSepH :: Char
headerSepH   = Char
'-'
       , headerSepLC :: Char
headerSepLC  = Char
'+'
       , headerSepRC :: Char
headerSepRC  = Char
'+'
       , headerSepC :: Char
headerSepC   = Char
'+'
       , headerTopL :: Char
headerTopL   = Char
'+'
       , headerTopR :: Char
headerTopR   = Char
'+'
       , headerTopC :: Char
headerTopC   = Char
'+'
       , headerTopH :: Char
headerTopH   = Char
'-'
       , headerV :: Char
headerV      = Char
'|'
       , groupV :: Char
groupV       = Char
'|'
       , groupSepH :: Char
groupSepH    = Char
'-'
       , groupSepC :: Char
groupSepC    = Char
'+'
       , groupSepLC :: Char
groupSepLC   = Char
'+'
       , groupSepRC :: Char
groupSepRC   = Char
'+'
       , groupTopC :: Char
groupTopC    = Char
'+'
       , groupTopL :: Char
groupTopL    = Char
'+'
       , groupTopR :: Char
groupTopR    = Char
'+'
       , groupTopH :: Char
groupTopH    = Char
'-'
       , groupBottomC :: Char
groupBottomC = Char
'+'
       , groupBottomL :: Char
groupBottomL = Char
'+'
       , groupBottomR :: Char
groupBottomR = Char
'+'
       , groupBottomH :: Char
groupBottomH = Char
'-'
       }

-- | Uses special unicode characters to draw clean thin boxes. 
unicodeS :: TableStyle
unicodeS :: TableStyle
unicodeS = TableStyle :: Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> TableStyle
TableStyle
         { headerSepH :: Char
headerSepH   = Char
'═'
         , headerSepLC :: Char
headerSepLC  = Char
'╞'
         , headerSepRC :: Char
headerSepRC  = Char
'╡'
         , headerSepC :: Char
headerSepC   = Char
'╪'
         , headerTopL :: Char
headerTopL   = Char
'┌'
         , headerTopR :: Char
headerTopR   = Char
'┐'
         , headerTopC :: Char
headerTopC   = Char
'┬'
         , headerTopH :: Char
headerTopH   = Char
'─'
         , headerV :: Char
headerV      = Char
'│'
         , groupV :: Char
groupV       = Char
'│'
         , groupSepH :: Char
groupSepH    = Char
'─'
         , groupSepC :: Char
groupSepC    = Char
'┼'
         , groupSepLC :: Char
groupSepLC   = Char
'├'
         , groupSepRC :: Char
groupSepRC   = Char
'┤'
         , groupTopC :: Char
groupTopC    = Char
'┬'
         , groupTopL :: Char
groupTopL    = Char
'┌'
         , groupTopR :: Char
groupTopR    = Char
'┐'
         , groupTopH :: Char
groupTopH    = Char
'─'
         , groupBottomC :: Char
groupBottomC = Char
'┴'
         , groupBottomL :: Char
groupBottomL = Char
'└'
         , groupBottomR :: Char
groupBottomR = Char
'┘'
         , groupBottomH :: Char
groupBottomH = Char
'─'
         }

-- | Same as 'unicodeS' but uses bold headers.
unicodeBoldHeaderS :: TableStyle
unicodeBoldHeaderS :: TableStyle
unicodeBoldHeaderS = TableStyle
unicodeS
                   { headerSepH :: Char
headerSepH  = Char
'━'
                   , headerSepLC :: Char
headerSepLC = Char
'┡'
                   , headerSepRC :: Char
headerSepRC = Char
'┩'
                   , headerSepC :: Char
headerSepC  = Char
'╇'
                   , headerTopL :: Char
headerTopL  = Char
'┏'
                   , headerTopR :: Char
headerTopR  = Char
'┓'
                   , headerTopC :: Char
headerTopC  = Char
'┳'
                   , headerTopH :: Char
headerTopH  = Char
'━'
                   , headerV :: Char
headerV     = Char
'┃'
                   }

-- | Same as 'unicodeS' but uses round edges.
unicodeRoundS :: TableStyle
unicodeRoundS :: TableStyle
unicodeRoundS = TableStyle
unicodeS
              { groupTopL :: Char
groupTopL    = Char
roundedTL
              , groupTopR :: Char
groupTopR    = Char
roundedTR
              , groupBottomL :: Char
groupBottomL = Char
roundedBL
              , groupBottomR :: Char
groupBottomR = Char
roundedBR
              , headerTopL :: Char
headerTopL   = Char
roundedTL
              , headerTopR :: Char
headerTopR   = Char
roundedTR
              }
  where
    roundedTL :: Char
roundedTL = Char
'╭'
    roundedTR :: Char
roundedTR = Char
'╮'
    roundedBL :: Char
roundedBL = Char
'╰'
    roundedBR :: Char
roundedBR = Char
'╯'

-- | Uses bold lines.
unicodeBoldS :: TableStyle
unicodeBoldS :: TableStyle
unicodeBoldS = TableStyle :: Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> TableStyle
TableStyle
             { headerSepH :: Char
headerSepH   = Char
'━'
             , headerSepLC :: Char
headerSepLC  = Char
'┣'
             , headerSepRC :: Char
headerSepRC  = Char
'┫'
             , headerSepC :: Char
headerSepC   = Char
'╋'
             , headerTopL :: Char
headerTopL   = Char
'┏'
             , headerTopR :: Char
headerTopR   = Char
'┓'
             , headerTopC :: Char
headerTopC   = Char
'┳'
             , headerTopH :: Char
headerTopH   = Char
'━'
             , headerV :: Char
headerV      = Char
'┃'
             , groupV :: Char
groupV       = Char
'┃'
             , groupSepH :: Char
groupSepH    = Char
'━'
             , groupSepC :: Char
groupSepC    = Char
'╋'
             , groupSepLC :: Char
groupSepLC   = Char
'┣'
             , groupSepRC :: Char
groupSepRC   = Char
'┫'
             , groupTopC :: Char
groupTopC    = Char
'┳'
             , groupTopL :: Char
groupTopL    = Char
'┏'
             , groupTopR :: Char
groupTopR    = Char
'┓'
             , groupTopH :: Char
groupTopH    = Char
'━'
             , groupBottomC :: Char
groupBottomC = Char
'┻'
             , groupBottomL :: Char
groupBottomL = Char
'┗'
             , groupBottomR :: Char
groupBottomR = Char
'┛'
             , groupBottomH :: Char
groupBottomH = Char
'━'
             }

-- | Uses bold lines with exception of group seperators, which are striped slim.
unicodeBoldStripedS :: TableStyle
unicodeBoldStripedS :: TableStyle
unicodeBoldStripedS = TableStyle
unicodeBoldS { groupSepH :: Char
groupSepH = Char
'-', groupSepC :: Char
groupSepC = Char
'┃', groupSepLC :: Char
groupSepLC = Char
'┃', groupSepRC :: Char
groupSepRC = Char
'┃' }

-- | Draw every line with a double frame.
unicodeDoubleFrameS :: TableStyle
unicodeDoubleFrameS :: TableStyle
unicodeDoubleFrameS = TableStyle :: Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> Char
-> TableStyle
TableStyle
                    { headerSepH :: Char
headerSepH   = Char
'═'
                    , headerSepLC :: Char
headerSepLC  = Char
'╠'
                    , headerSepRC :: Char
headerSepRC  = Char
'╣'
                    , headerSepC :: Char
headerSepC   = Char
'╬'
                    , headerTopL :: Char
headerTopL   = Char
'╔'
                    , headerTopR :: Char
headerTopR   = Char
'╗'
                    , headerTopC :: Char
headerTopC   = Char
'╦'
                    , headerTopH :: Char
headerTopH   = Char
'═'
                    , headerV :: Char
headerV      = Char
'║'
                    , groupV :: Char
groupV       = Char
'║'
                    , groupSepH :: Char
groupSepH    = Char
'═'
                    , groupSepC :: Char
groupSepC    = Char
'╬'
                    , groupSepLC :: Char
groupSepLC   = Char
'╠'
                    , groupSepRC :: Char
groupSepRC   = Char
'╣'
                    , groupTopC :: Char
groupTopC    = Char
'╦'
                    , groupTopL :: Char
groupTopL    = Char
'╔'
                    , groupTopR :: Char
groupTopR    = Char
'╗'
                    , groupTopH :: Char
groupTopH    = Char
'═'
                    , groupBottomC :: Char
groupBottomC = Char
'╩'
                    , groupBottomL :: Char
groupBottomL = Char
'╚'
                    , groupBottomR :: Char
groupBottomR = Char
'╝'
                    , groupBottomH :: Char
groupBottomH = Char
'═'
                    }