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