text-display: A typeclass for user-facing output

[ library, mit, text ] [ Propose Tags ]

The Display typeclass provides a solution for user-facing output that does not have to abide by the rules of the Show typeclass.

[Skip to Readme]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees


Versions [RSS],,
Change log CHANGELOG.md
Dependencies base (>=4.12 && <=5), bytestring (>=0.10 && <0.12), text (>=2.0) [details]
License MIT
Author Hécate Moonlight
Maintainer Hécate Moonlight
Category Text
Home page https://github.com/haskell-text/text-display#readme
Bug tracker https://github.com/haskell-text/text-display/issues
Source repo head: git clone https://github.com/haskell-text/text-display
Uploaded by hecate at 2022-08-21T21:36:33Z
Distributions NixOS:
Downloads 283 total (12 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for text-display-

[back to package description]

CI badge made with Haskell Hackage

Buy Me a Coffee at ko-fi.com

A Typeclass for user-facing output


The text-display library offers a way for developers to print a textual representation of datatypes that does not have to abide by the rules of the Show typeclass.

If you wish to learn more about how things are done and why, please read the DESIGN.md file.


There are two methods to implement Display for your type:

The first one is a manual implementation:

data ManualType = MT Int

-- >>> display (MT 32)
-- "MT 32"
instance Display ManualType where
  displayPrec prec (MT i) = displayParen (prec > 10) $ "MT " <> displayPrec 11 i

But this can be quite time-consuming, especially if your datatype already has an existing Show that you wish to reuse. In which case, you can piggy-back on this instance like this:

{-# LANGUAGE DerivingVia #-}
data AutomaticallyDerived = AD
  -- We derive 'Show'
  deriving Show 
  -- We take advantage of the 'Show' instance to derive 'Display' from it
  deriving Display
    via (ShowInstance AutomaticallyDerived) 

But let's say you want to redact an instance of Display? You can do it locally, through the OpaqueInstance helper. It is most useful to hide tokens or passwords:

data UserToken = UserToken UUID                           
 deriving Display                                         
   via (OpaqueInstance "[REDACTED]" UserToken)            
display $ UserToken "7a01d2ce-31ff-11ec-8c10-5405db82c3cd"
-- => "[REDACTED]"