/text-display

A Typeclass for user-facing output

Primary LanguageHaskellMIT LicenseMIT

CI badge made with Haskell Hackage

Buy Me a Coffee at ko-fi.com

A Typeclass for user-facing output

Description

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.

Examples

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]"