The `KVITable` is similar to a `Map`, but the keys to the map are a
list of `Key=Val` data. Although the `KVITable` is perfectly useable
as a container in this fashion, the main use of the `KVITable` is in
rendering this data in various configurations; because of this focus,
there is no particular attention to other container aspects such as:
performance, space usage, etc.
An example table can be created via:
```haskell
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
import Data.KVITable
nestedTable = foldl foldlInsert
(mempty
& keyVals .~ [ ("millions", ["0"])
, ("thousands", ["0"])
, ("hundreds", ["0"])
, ("tens", ["0"])
, ("ones", ["0"])
]
)
[ ([("millions", T.pack $ show m)
,("thousands", T.pack $ show t)
,("hundreds", T.pack $ show h)
,("tens", T.pack $ show d)
,("ones", T.pack $ show o)],
if (o `rem` 2) == 1 then "odd" else "even")
| m <- [0..2 :: Int]
, t <- [0..2 :: Int]
, h <- [1..2 :: Int]
, d <- [2..2 :: Int]
, o <- [0..1 :: Int]
]
```
This Haskell code generates a table where the keys are the various
scale indicators along with a corresponding key value. The table
entries themselves are the words `odd` or `even`.
Rendering this table in ASCII mode, with blank rows and columns
hidden, and enabling column stacking at the "hundreds" key column can
be done with the following code:
```haskell
import Data.KVITable.Render.ASCII
render (defaultRenderConfig { sortKeyVals = True
, rowRepeat = False
, hideBlankCols = True
, hideBlankRows = True
, equisizedCols = False
, colStackAt = Just "hundreds"
}) nestedTable
```
The output from this rendering will look like:
```
____ snip vv ____
| millions | thousands | ___ 1 ____ | ___ 2 ____ | <- hundreds
| | | ___ 2 ____ | ___ 2 ____ | <- tens
| | | 0 | 1 | 0 | 1 | <- ones
+----------+-----------+------+-----+------+-----+
| 0 | 0 | even | odd | even | odd |
| | 1 | even | odd | even | odd |
| | 2 | even | odd | even | odd |
| 1 | 0 | even | odd | even | odd |
| | 1 | even | odd | even | odd |
| | 2 | even | odd | even | odd |
| 2 | 0 | even | odd | even | odd |
| | 1 | even | odd | even | odd |
| | 2 | even | odd | even | odd |
____ snip ^^ ____
```
When rendered to HTML instead by using the same code but importing
`Data.KVITable.Render.HTML` (and please use a little CSS to make
things prettier), the following is obtained:
****
millions |
thousands |
1 |
2 |
←hundreds |
2 |
2 |
←tens |
0 |
1 |
0 |
1 |
←ones |
0 |
0 |
even |
odd |
even |
odd |
1 |
even |
odd |
even |
odd |
2 |
even |
odd |
even |
odd |
1 |
0 |
even |
odd |
even |
odd |
1 |
even |
odd |
even |
odd |
2 |
even |
odd |
even |
odd |
2 |
0 |
even |
odd |
even |
odd |
1 |
even |
odd |
even |
odd |
2 |
even |
odd |
even |
odd |
****
## Different ColStack specification
By changing the `colStackAt` specification in the rendering
configuration from the "hundreds" column to the "thousands" column,
the column at which `Key Val`'s are shown as column headers instead of
rows is changed and the following ASCII results are obtained:
```
____ snip vv ____
| millions | __________ 0 __________ | __________ 1 __________ | __________ 2 __________ | <- thousands
| | ___ 1 ____ | ___ 2 ____ | ___ 1 ____ | ___ 2 ____ | ___ 1 ____ | ___ 2 ____ | <- hundreds
| | ___ 2 ____ | ___ 2 ____ | ___ 2 ____ | ___ 2 ____ | ___ 2 ____ | ___ 2 ____ | <- tens
| | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | <- ones
+----------+------+-----+------+-----+------+-----+------+-----+------+-----+------+-----+
| 0 | even | odd | even | odd | even | odd | even | odd | even | odd | even | odd |
| 1 | even | odd | even | odd | even | odd | even | odd | even | odd | even | odd |
| 2 | even | odd | even | odd | even | odd | even | odd | even | odd | even | odd |
____ snip ^^ ____
```
or as HTML:
****
millions |
0 |
1 |
2 |
←thousands |
1 |
2 |
1 |
2 |
1 |
2 |
←hundreds |
2 |
2 |
2 |
2 |
2 |
2 |
←tens |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
←ones |
0 |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
1 |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
2 |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
even |
odd |
****
## No column stacking
Alternatively, the `colStackAt` rendering configuration parameter may
be specified as `Nothing`, indicating that all `Key Val` values are to
be specified on separate rows, with no stacked columns. The ASCII
form of this is:
```
____ snip vv ____
| millions | thousands | hundreds | tens | ones | Value |
+----------+-----------+----------+------+------+-------+
| 0 | 0 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| | 1 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| | 2 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| 1 | 0 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| | 1 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| | 2 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| 2 | 0 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| | 1 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
| | 2 | 1 | 2 | 0 | even |
| | | | | 1 | odd |
| | | 2 | 2 | 0 | even |
| | | | | 1 | odd |
____ snip ^^ ____
```
and the HTML form is
****
millions |
thousands |
hundreds |
tens |
ones |
Value |
0 |
0 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
1 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
2 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
1 |
0 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
1 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
2 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
2 |
0 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
1 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
2 |
1 |
2 |
0 |
even |
1 |
odd |
2 |
2 |
0 |
even |
1 |
odd |
****
More examples can be found in the examples subdirectory, including:
* [Zoo Inventory](examples/zoo.md)