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 | ||
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 | |
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 |