Making a choice from a list in Haskell, Vty (part 1)
After posting the zeroth part of this series I realised I hadn’t said
anything about the final goal of this exercise. The first post contained code
for choosing one one-line string (String) out of a list of one-line strings
([String]). What I really want is the ability to choose one item out of a
list of items, where each may render to be multiple lines. It would also be
really cool if an item could be collapsed and expanded in the rendering.
This is the first step in my journey towards these loosely specified
requriements.
Rendering items into strings sounds like pretty-printing to me, so I played
around a little with a few pretty-printing libraries. Finally I settled on
the Wadler/Leijen Pretty Printer (Text.PrettyPrint.Leijen). I didn’t
really have any strong reason for choosing it, beyond that it comes with its
own type class whereas the pretty-printing library that ships with GHC
(Text.PrettyPrint.HughesPJ) doesn’t (though there is a package on
HackageDB with a class for it).
I did the smallest change I could think of to add pretty-printing. First the module needs to be imported of course:
import Text.PrettyPrint.Leijen
Then I added a function to turn a list of items into a document (Doc) where
each item is pretty-printed on its own line:
myPrettyList :: Pretty a => [a] -> Doc myPrettyList = vcat . map pretty
I then decided that _getChoice should be left unchanged and instead modified
getChoice to turn the list of items into a list of strings:
getChoice vt opts = let _converted_opts = myPrettyList opts in do (sx, sy) <- getSize vt _getChoice vt (lines $ show _converted_opts) 0 sx sy
That’s it. The first step, albeit a small one.
![[Digg]](http://therning.org/magnus/wp-content/plugins/bookmarkify/digg.png)
![[Reddit]](http://therning.org/magnus/wp-content/plugins/bookmarkify/reddit.png)
[...] Incoherent mumblings « Making a choice from a list in Haskell, Vty (part 1) [...]