module Text.Tabular.SimpleText where

import Data.List (intersperse, transpose)
import Text.Tabular

render :: String -- ^ delim
       -> (rh -> String)
       -> (ch -> String)
       -> (a -> String)
       -> Table rh ch a
       -> String
render :: forall rh ch a.
String
-> (rh -> String)
-> (ch -> String)
-> (a -> String)
-> Table rh ch a
-> String
render String
delim rh -> String
fr ch -> String
fc a -> String
f (Table Header rh
rh Header ch
ch [[a]]
cells) =
  [String] -> String
unlines forall a b. (a -> b) -> a -> b
$ [ String -> Header String -> String
renderColumns String
delim Header String
ch2
            ] forall a. [a] -> [a] -> [a]
++
            (forall {a}. Header a -> [a]
renderRs forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([a], String) -> String
renderR forall a b. (a -> b) -> a -> b
$ forall h a. h -> [h] -> Header a -> Header (h, a)
zipHeader [] [[a]]
cells forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap rh -> String
fr Header rh
rh)
 where
  -- ch2 and cell2 include the row and column labels
  ch2 :: Header String
ch2 = forall h. Properties -> [Header h] -> Header h
Group Properties
DoubleLine [forall h. h -> Header h
Header String
"", forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ch -> String
fc Header ch
ch]
  cells2 :: [[String]]
cells2 = forall {a}. Header a -> [a]
headerContents Header String
ch2
         forall a. a -> [a] -> [a]
: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\String
h [a]
cs -> String
h forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map a -> String
f [a]
cs) [String]
rhStrings [[a]]
cells
  --
  renderR :: ([a], String) -> String
renderR ([a]
cs,String
h) = String -> Header String -> String
renderColumns String
delim forall a b. (a -> b) -> a -> b
$ forall h. Properties -> [Header h] -> Header h
Group Properties
DoubleLine
                    [ forall h. h -> Header h
Header String
h
                    , forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall h a. h -> [h] -> Header a -> Header (h, a)
zipHeader String
"" (forall a b. (a -> b) -> [a] -> [b]
map a -> String
f [a]
cs) Header ch
ch]
  rhStrings :: [String]
rhStrings = forall a b. (a -> b) -> [a] -> [b]
map rh -> String
fr forall a b. (a -> b) -> a -> b
$ forall {a}. Header a -> [a]
headerContents Header rh
rh
  renderRs :: Header a -> [a]
renderRs (Header a
s)   = [a
s]
  renderRs (Group Properties
_ [Header a]
hs) = forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Header a -> [a]
renderRs [Header a]
hs

renderColumns :: String
              -> Header String
              -> String
renderColumns :: String -> Header String -> String
renderColumns String
delim Header String
h =
  forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall {a}. Either a String -> String
helper forall a b. (a -> b) -> a -> b
$ forall h. Header h -> [Either Properties h]
flattenHeader Header String
h
 where
  helper :: Either a String -> String
helper = forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (forall a b. a -> b -> a
const String
delim) forall a. a -> a
id