heidi
heidi copied to clipboard
pretty printing/ASCII visualization of encoded rows
e.g. ascii :
+-------------+-----------------+
| Person | House |
+-------+-----+-------+---------+
| Name | Age | Color | Price |
+-------+-----+-------+---------+
| David | 63 | Green | $170000 |
| Ava | 34 | Blue | $115000 |
| Sonia | 12 | Green | $150000 |
+-------+-----+-------+---------+
https://hackage.haskell.org/package/colonnade-1.2.0.1/docs/Colonnade.html#g:10
generate CSV header from the type with generics-sop metadata
After a fair bit of trial and error, header produces a
simple representation of an arbitrary type which can be pretty-printed
as a tree :
data A = MkA Int deriving (Eq, Show, G.Generic, Heidi)
data B = MkB Int Char deriving (Eq, Show, G.Generic, Heidi)
data B2 = MkB2 { b21 :: Int, b22 :: Char } deriving (Eq, Show, G.Generic, Heidi)
data C = MkC1 {c1 :: Int} | MkC2 A | MkC3 () deriving (Eq, Show, G.Generic, Heidi)
data R = MkR { r1 :: B2, r2 :: C , r3 :: B } deriving (Eq, Show, G.Generic, Heidi)
λ> printBox $ headerBox $ header (Proxy @R)
R
------------------------------------------------
MkR
R
------------*------------*----------------------
r1 | r3 | r2
B2 B C
---------- ---------- ------+------+------
MkB2 MkB MkC3 | MkC1 | MkC2
B2 B () Int A
----*----- ----*----- ---
b21 | b22 _0 | _1 MkA
Int Char Int Char Int
In case someone else wants to move this forward, my thinking so far is as follows:
- [x]
headercomputes a rose tree representation of a type, and only requires aGenericand an empty instance ofHasHeader(populated automatically via the Generic instance) (see https://github.com/ocramz/heidi/blob/master/src/Core/Data/Frame/PrettyPrint.hs#L152 ) - [x] similarly,
encodeuses the generic representation of a value and produces a corresponding representation; values however (i.e. data rows) are "flattened" from rose trees into one-level deep tries, keyed by lists of elements (https://github.com/ocramz/heidi/blob/master/src/Data/Generics/Encode/Internal.hs#L101). This flat representation makes lookup and traversal convenient. Aheididataframe is produced byencodeing all values in a list. - [x] the rose trees produced by
headerare convenient for pretty-printing the sum-of-products structure of general Haskell ADTs, as seen above (implementation at https://github.com/ocramz/heidi/blob/master/src/Core/Data/Frame/PrettyPrint.hs#L91 ) - [ ] additionally, the trees produced by
headercontain all possible combination of keys that might appear inencoded values, which is whyHeadervalues can be used in the Show instance of anencoded dataframe:- [ ] take few rows (e.g. 10) for each value, perform lookup using the
Headerkeys and render in the corresponding column, under the header
- [ ] take few rows (e.g. 10) for each value, perform lookup using the