ISC licensed by Kevin Quick
Maintained by [email protected]
This version can be pinned in stack with:kvitable-1.1.0.1@sha256:6620d97049a9e05f50be5dd77063ef1d154ce0ea558c6da329ae41b580bc8146,3259

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:

{-# 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:

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:



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:



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



More examples can be found in the examples subdirectory, including:

Changes

Revision history for KVITable

1.1.0.1 – 2024-09-21

  • Add test/evenodd.md and test/bigsquare.md to cabal data files.

1.1.0.0 – 2024-09-18

  • The RenderConfig.sortKeyVals changed from a Boolean to a Maybe fn, where the fn is a sorting function which is provided a (rowKeyvals, colKeyvals) tuple and should return that tuple, sorted. The sortNumericAlpha function can be used to obtain the old ‘True’ behavior.
  • Support GHC 9.10.

1.0.3.0 – 2024-02-22

  • Support GHC 9.8.
  • Internal updates to confirm safety and avoid partial functions.

1.0.2.0 – 2023-01-09

  • Support GHC 9.4.

1.0.1.0 – 2022-05-26

  • Support GHC 9.2 [thanks to Ryan Scott].

1.0.0.0 – 2021-01-30

  • Initial version