Making a choice from a list in Haskell, Vty (part 1)
- Magnus Therning
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
= vcat . map pretty myPrettyList
I then decided that _getChoice
should be left unchanged and instead modified getChoice
to turn the list of items into a list of strings:
= let
getChoice vt opts = myPrettyList opts
_converted_opts in do
<- getSize vt
(sx, sy) lines $ show _converted_opts) 0 sx sy _getChoice vt (
That’s it. The first step, albeit a small one.