11{-# LANGUAGE DataKinds #-}
2- {-# LANGUAGE OverloadedStrings #-}
32{-# LANGUAGE DerivingVia #-}
43{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4+ {-# LANGUAGE OverloadedStrings #-}
55{-# LANGUAGE ScopedTypeVariables #-}
66{-# LANGUAGE StandaloneDeriving #-}
77{-# LANGUAGE StrictData #-}
1010{-# LANGUAGE TypeOperators #-}
1111{-# LANGUAGE UndecidableInstances #-}
1212
13- {-|
14- Module : Data.Text.Display
15- Copyright : © Hécate Moonlight, 2021
16- License : MIT
17- 18- Stability : stable
19-
20- Use 'display' to produce user-facing text
21-
22- -}
13+ -- |
14+ -- Module : Data.Text.Display
15+ -- Copyright : © Hécate Moonlight, 2021
16+ -- License : MIT
17+ 18+ -- Stability : stable
19+ --
20+ -- Use 'display' to produce user-facing text
2321module Data.Text.Display
2422 ( -- * Documentation
2523 display
26- , Display (.. )
27- , -- * Deriving your instance automatically
28- ShowInstance (.. )
29- , OpaqueInstance (.. )
30- , -- * Writing your instance by hand
31- displayParen
32- -- * Design choices
33- -- $designChoices
34- ) where
24+ , Display (.. )
25+
26+ -- * Deriving your instance automatically
27+ , ShowInstance (.. )
28+ , OpaqueInstance (.. )
29+
30+ -- * Writing your instance by hand
31+ , displayParen
32+
33+ -- * Design choices
34+ -- $designChoices
35+ )
36+ where
3537
3638import Control.Exception hiding (TypeError )
3739import Data.ByteString
40+ import qualified Data.ByteString.Lazy as BL
3841import Data.Int
3942import Data.Kind
4043import Data.List.NonEmpty
44+ import Data.Proxy
4145import Data.Text (Text )
46+ import qualified Data.Text as T
47+ import qualified Data.Text.Lazy as TL
4248import Data.Text.Lazy.Builder (Builder )
43- import Data.Word
44- import GHC.TypeLits
45- import qualified Data.ByteString.Lazy as BL
4649import qualified Data.Text.Lazy.Builder as TB
4750import qualified Data.Text.Lazy.Builder.Int as TB
4851import qualified Data.Text.Lazy.Builder.RealFloat as TB
49- import qualified Data.Text as T
50- import qualified Data.Text.Lazy as TL
51- import Data.Proxy
52+ import Data.Word
53+ import GHC.TypeLits
5254
5355-- | A typeclass for user-facing output.
5456--
5557-- @since 0.0.1.0
5658class Display a where
5759 {-# MINIMAL displayBuilder | displayPrec #-}
60+
5861 -- | Implement this method to describe how to convert your value to 'Builder'.
5962 displayBuilder :: a -> Builder
6063 displayBuilder = displayPrec 0
@@ -91,11 +94,11 @@ class Display a where
9194 -- > → Custom `displayList`
9295 displayList :: [a ] -> Builder
9396 displayList [] = " []"
94- displayList (x: xs) = displayList' xs (" [" <> displayBuilder x)
97+ displayList (x : xs) = displayList' xs (" [" <> displayBuilder x)
9598 where
9699 displayList' :: [a ] -> Builder -> Builder
97- displayList' [] acc = acc <> " ]"
98- displayList' (y: ys) acc = displayList' ys (acc <> " ," <> displayBuilder y)
100+ displayList' [] acc = acc <> " ]"
101+ displayList' (y : ys) acc = displayList' ys (acc <> " ," <> displayBuilder y)
99102
100103 -- | The method 'displayPrec' allows you to write instances that
101104 -- require nesting. The precedence parameter can be thought of as a
@@ -127,13 +130,13 @@ class Display a where
127130 -- > infix 5 :*: -- arbitrary choice of precedence
128131 -- > instance (Display a, Display b) => Display (Pair a b) where
129132 -- > displayPrec prec (a :*: b) = displayParen (prec > 5) $ displayPrec 6 a <> " :*: " <> displayPrec 6 b
130- displayPrec
131- :: Int -- ^ The precedence level passed in by the surrounding context
132- -> a
133- -> Builder
133+ displayPrec ::
134+ -- | The precedence level passed in by the surrounding context
135+ Int ->
136+ a ->
137+ Builder
134138 displayPrec _ = displayBuilder
135139
136-
137140-- | Convert a value to a readable 'Text'.
138141--
139142-- === Examples
@@ -159,12 +162,13 @@ instance CannotDisplayBareFunctions => Display (a -> b) where
159162
160163-- | @since 0.0.1.0
161164type family CannotDisplayBareFunctions :: Constraint where
162- CannotDisplayBareFunctions = TypeError
163- ( 'Text " 🚫 You should not try to display functions!" ':$$:
164- 'Text " 💡 Write a 'newtype' wrapper that represents your domain more accurately." ':$$:
165- 'Text " If you are not consciously trying to use `display` on a function," ':$$:
166- 'Text " make sure that you are not missing an argument somewhere."
167- )
165+ CannotDisplayBareFunctions =
166+ TypeError
167+ ( 'Text " 🚫 You should not try to display functions!"
168+ ':$$: 'Text " 💡 Write a 'newtype' wrapper that represents your domain more accurately."
169+ ':$$: 'Text " If you are not consciously trying to use `display` on a function,"
170+ ':$$: 'Text " make sure that you are not missing an argument somewhere."
171+ )
168172
169173-- | 🚫 You should not try to display strict ByteStrings!
170174--
@@ -185,11 +189,12 @@ instance CannotDisplayByteStrings => Display BL.ByteString where
185189 displayBuilder = undefined
186190
187191type family CannotDisplayByteStrings :: Constraint where
188- CannotDisplayByteStrings = TypeError
189- ( 'Text " 🚫 You should not try to display ByteStrings!" ':$$:
190- 'Text " 💡 Always provide an explicit encoding" ':$$:
191- 'Text " Use 'Data.Text.Encoding.decodeUtf8'' or 'Data.Text.Encoding.decodeUtf8With' to convert from UTF-8"
192- )
192+ CannotDisplayByteStrings =
193+ TypeError
194+ ( 'Text " 🚫 You should not try to display ByteStrings!"
195+ ':$$: 'Text " 💡 Always provide an explicit encoding"
196+ ':$$: 'Text " Use 'Data.Text.Encoding.decodeUtf8'' or 'Data.Text.Encoding.decodeUtf8With' to convert from UTF-8"
197+ )
193198
194199-- | A utility function that surrounds the given 'Builder' with parentheses when the Bool parameter is True.
195200-- Useful for writing instances that may require nesting. See the 'displayPrec' documentation for more
@@ -237,7 +242,8 @@ instance KnownSymbol str => Display (OpaqueInstance str a) where
237242newtype ShowInstance (a :: Type )
238243 = ShowInstance a
239244 deriving newtype
240- ( Show -- ^ @since 0.0.1.0
245+ ( -- | @since 0.0.1.0
246+ Show
241247 )
242248
243249-- | This wrapper allows you to rely on a pre-existing 'Show' instance in order to derive 'Display' from it.
@@ -301,9 +307,10 @@ instance Display Text where
301307
302308-- | @since 0.0.1.0
303309instance Display a => Display [a ] where
304- {-# SPECIALISE instance Display [String] #-}
305- {-# SPECIALISE instance Display [Char] #-}
306- {-# SPECIALISE instance Display [Int] #-}
310+ {-# SPECIALIZE instance Display [String] #-}
311+ {-# SPECIALIZE instance Display [Char] #-}
312+ {-# SPECIALIZE instance Display [Int] #-}
313+
307314 -- In this instance, 'displayBuilder' is defined in terms of 'displayList', which for most types
308315 -- is defined as the default written in the class declaration.
309316 -- But when @a ~ Char@, there is an explicit implementation that is selected instead, which
@@ -373,15 +380,15 @@ deriving via (ShowInstance SomeException) instance Display SomeException
373380
374381-- | @since 0.0.1.0
375382instance (Display a , Display b ) => Display (a , b ) where
376- displayBuilder (a, b) = " (" <> displayBuilder a <> " ," <> displayBuilder b <> " )"
383+ displayBuilder (a, b) = " (" <> displayBuilder a <> " ," <> displayBuilder b <> " )"
377384
378385-- | @since 0.0.1.0
379386instance (Display a , Display b , Display c ) => Display (a , b , c ) where
380- displayBuilder (a, b, c) = " (" <> displayBuilder a <> " ," <> displayBuilder b <> " ," <> displayBuilder c <> " )"
387+ displayBuilder (a, b, c) = " (" <> displayBuilder a <> " ," <> displayBuilder b <> " ," <> displayBuilder c <> " )"
381388
382389-- | @since 0.0.1.0
383390instance (Display a , Display b , Display c , Display d ) => Display (a , b , c , d ) where
384- displayBuilder (a, b, c, d) = " (" <> displayBuilder a <> " ," <> displayBuilder b <> " ," <> displayBuilder c <> " ," <> displayBuilder d <> " )"
391+ displayBuilder (a, b, c, d) = " (" <> displayBuilder a <> " ," <> displayBuilder b <> " ," <> displayBuilder c <> " ," <> displayBuilder d <> " )"
385392
386393-- $designChoices
387394--
0 commit comments