remove conflicting import for nhc98
[haskell-directory.git] / GHC / Show.lhs
index 5c0382a..15e5913 100644 (file)
@@ -1,5 +1,5 @@
 \begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
+{-# OPTIONS_GHC -fno-implicit-prelude #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  GHC.Show
@@ -14,6 +14,7 @@
 --
 -----------------------------------------------------------------------------
 
+-- #hide
 module GHC.Show
        (
        Show(..), ShowS,
@@ -31,14 +32,12 @@ module GHC.Show
   ) 
        where
 
-import {-# SOURCE #-} GHC.Err ( error )
 import GHC.Base
-import GHC.Enum
 import Data.Maybe
 import Data.Either
-import GHC.List        ( (!!),
+import GHC.List        ( (!!), foldr1
 #ifdef USE_REPORT_PRELUDE
-                , concatMap, foldr1
+                , concatMap
 #endif
                 )
 \end{code}
@@ -52,11 +51,92 @@ import GHC.List     ( (!!),
 %*********************************************************
 
 \begin{code}
+-- | The @shows@ functions return a function that prepends the
+-- output 'String' to an existing 'String'.  This allows constant-time
+-- concatenation of results using function composition.
 type ShowS = String -> String
 
+-- | Conversion of values to readable 'String's.
+--
+-- Minimal complete definition: 'showsPrec' or 'show'.
+--
+-- Derived instances of 'Show' have the following properties, which
+-- are compatible with derived instances of 'Text.Read.Read':
+--
+-- * The result of 'show' is a syntactically correct Haskell
+--   expression containing only constants, given the fixity
+--   declarations in force at the point where the type is declared.
+--   It contains only the constructor names defined in the data type,
+--   parentheses, and spaces.  When labelled constructor fields are
+--   used, braces, commas, field names, and equal signs are also used.
+--
+-- * If the constructor is defined to be an infix operator, then
+--   'showsPrec' will produce infix applications of the constructor.
+--
+-- * the representation will be enclosed in parentheses if the
+--   precedence of the top-level constructor in @x@ is less than @d@
+--   (associativity is ignored).  Thus, if @d@ is @0@ then the result
+--   is never surrounded in parentheses; if @d@ is @11@ it is always
+--   surrounded in parentheses, unless it is an atomic expression.
+--
+-- * If the constructor is defined using record syntax, then 'show'
+--   will produce the record-syntax form, with the fields given in the
+--   same order as the original declaration.
+--
+-- For example, given the declarations
+--
+-- > infixr 5 :^:
+-- > data Tree a =  Leaf a  |  Tree a :^: Tree a
+--
+-- the derived instance of 'Show' is equivalent to
+--
+-- > instance (Show a) => Show (Tree a) where
+-- >
+-- >        showsPrec d (Leaf m) = showParen (d > app_prec) $
+-- >             showString "Leaf " . showsPrec (app_prec+1) m
+-- >          where app_prec = 10
+-- >
+-- >        showsPrec d (u :^: v) = showParen (d > up_prec) $
+-- >             showsPrec (up_prec+1) u . 
+-- >             showString " :^: "      .
+-- >             showsPrec (up_prec+1) v
+-- >          where up_prec = 5
+--
+-- Note that right-associativity of @:^:@ is ignored.  For example,
+--
+-- * @'show' (Leaf 1 :^: Leaf 2 :^: Leaf 3)@ produces the string
+--   @\"Leaf 1 :^: (Leaf 2 :^: Leaf 3)\"@.
+
 class  Show a  where
-    showsPrec :: Int -> a -> ShowS
+    -- | Convert a value to a readable 'String'.
+    --
+    -- 'showsPrec' should satisfy the law
+    --
+    -- > showsPrec d x r ++ s  ==  showsPrec d x (r ++ s)
+    --
+    -- Derived instances of 'Text.Read.Read' and 'Show' satisfy the following:
+    --
+    -- * @(x,\"\")@ is an element of
+    --   @('Text.Read.readsPrec' d ('showsPrec' d x \"\"))@.
+    --
+    -- That is, 'Text.Read.readsPrec' parses the string produced by
+    -- 'showsPrec', and delivers the value that 'showsPrec' started with.
+
+    showsPrec :: Int   -- ^ the operator precedence of the enclosing
+                       -- context (a number from @0@ to @11@).
+                       -- Function application has precedence @10@.
+             -> a      -- ^ the value to be converted to a 'String'
+             -> ShowS
+
+    -- | A specialised variant of 'showsPrec', using precedence context
+    -- zero, and returning an ordinary 'String'.
     show      :: a   -> String
+
+    -- | The method 'showList' is provided to allow the programmer to
+    -- give a specialised way of showing lists of values.
+    -- For example, this is used by the predefined 'Show' instance of
+    -- the 'Char' type, where values of type 'String' should be shown
+    -- in double quotes, rather than between square brackets.
     showList  :: [a] -> ShowS
 
     showsPrec _ x s = show x ++ s
@@ -147,30 +227,80 @@ instance (Show a, Show b) => Show (Either a b) where
 --                         \s -> showChar '(' (sx (showChar ',' (sy (showChar ')' s))))
 
 instance  (Show a, Show b) => Show (a,b)  where
-    showsPrec _ (x,y) s = (showChar '(' . shows x . showChar ',' .
-                                          shows y . showChar ')') 
-                         s
+  showsPrec _ (a,b) s = show_tuple [shows a, shows b] s
 
 instance (Show a, Show b, Show c) => Show (a, b, c) where
-    showsPrec _ (x,y,z) s = (showChar '(' . shows x . showChar ',' .
-                                           shows y . showChar ',' .
-                                           shows z . showChar ')')
-                           s
+  showsPrec _ (a,b,c) s = show_tuple [shows a, shows b, shows c] s
 
 instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where
-    showsPrec _ (w,x,y,z) s = (showChar '(' . shows w . showChar ',' .
-                                             shows x . showChar ',' .
-                                             shows y . showChar ',' .
-                                             shows z . showChar ')')
-                             s
+  showsPrec _ (a,b,c,d) s = show_tuple [shows a, shows b, shows c, shows d] s
 
 instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where
-    showsPrec _ (v,w,x,y,z) s = (showChar '(' . shows v . showChar ',' .
-                                               shows w . showChar ',' .
-                                               shows x . showChar ',' .
-                                               shows y . showChar ',' .
-                                               shows z . showChar ')') 
-                               s
+  showsPrec _ (a,b,c,d,e) s = show_tuple [shows a, shows b, shows c, shows d, shows e] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f) => Show (a,b,c,d,e,f) where
+  showsPrec _ (a,b,c,d,e,f) s = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g)
+       => Show (a,b,c,d,e,f,g) where
+  showsPrec _ (a,b,c,d,e,f,g) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h)
+        => Show (a,b,c,d,e,f,g,h) where
+  showsPrec _ (a,b,c,d,e,f,g,h) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i)
+        => Show (a,b,c,d,e,f,g,h,i) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j)
+        => Show (a,b,c,d,e,f,g,h,i,j) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i,j) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i, shows j] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k)
+        => Show (a,b,c,d,e,f,g,h,i,j,k) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i, shows j, shows k] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,
+         Show l)
+        => Show (a,b,c,d,e,f,g,h,i,j,k,l) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i, shows j, shows k, shows l] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,
+         Show l, Show m)
+        => Show (a,b,c,d,e,f,g,h,i,j,k,l,m) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l,m) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i, shows j, shows k, shows l, shows m] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,
+         Show l, Show m, Show n)
+        => Show (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l,m,n) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i, shows j, shows k, shows l, shows m, shows n] s
+
+instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, Show h, Show i, Show j, Show k,
+         Show l, Show m, Show n, Show o)
+        => Show (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where
+  showsPrec _ (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) s 
+       = show_tuple [shows a, shows b, shows c, shows d, shows e, shows f, shows g, shows h, 
+                     shows i, shows j, shows k, shows l, shows m, shows n, shows o] s
+
+show_tuple :: [ShowS] -> ShowS
+show_tuple ss = showChar '('
+             . foldr1 (\s r -> s . showChar ',' . r) ss
+             . showChar ')'
 \end{code}
 
 
@@ -181,15 +311,22 @@ instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where
 %*********************************************************
 
 \begin{code}
+-- | equivalent to 'showsPrec' with a precedence of 0.
 shows           :: (Show a) => a -> ShowS
 shows           =  showsPrec zeroInt
 
+-- | utility function converting a 'Char' to a show function that
+-- simply prepends the character unchanged.
 showChar        :: Char -> ShowS
 showChar        =  (:)
 
+-- | utility function converting a 'String' to a show function that
+-- simply prepends the string unchanged.
 showString      :: String -> ShowS
 showString      =  (++)
 
+-- | utility function that surrounds the inner show function with
+-- parentheses when the 'Bool' parameter is 'True'.
 showParen       :: Bool -> ShowS -> ShowS
 showParen b p   =  if b then showChar '(' . p . showChar ')' else p
 
@@ -200,6 +337,11 @@ showSpace = {-showChar ' '-} \ xs -> ' ' : xs
 Code specific for characters
 
 \begin{code}
+-- | Convert a character to a string using only printable characters,
+-- using Haskell source-language escape conventions.  For example:
+--
+-- > showLitChar '\n' s  =  "\\n" ++ s
+--
 showLitChar               :: Char -> ShowS
 showLitChar c s | c > '\DEL' =  showChar '\\' (protectEsc isDec (shows (ord c)) s)
 showLitChar '\DEL'        s =  showString "\\DEL" s
@@ -237,6 +379,9 @@ asciiTab = -- Using an array drags in the array module.  listArray ('\NUL', ' ')
 Code specific for Ints.
 
 \begin{code}
+-- | Convert an 'Int' in the range @0@..@15@ to the corresponding single
+-- digit 'Char'.  This function fails on other inputs, and generates
+-- lower-case hexadecimal digits.
 intToDigit :: Int -> Char
 intToDigit (I# i)
     | i >=# 0#  && i <=#  9# =  unsafeChr (ord '0' `plusInt` I# i)
@@ -252,12 +397,13 @@ showSignedInt (I# p) (I# n) r
 
 itos :: Int# -> String -> String
 itos n# cs
-    | n# <# 0# = let
-        n'# = negateInt# n#
-        in if n'# <# 0# -- minInt?
-            then '-' : itos' (negateInt# (n'# `quotInt#` 10#))
-                             (itos' (negateInt# (n'# `remInt#` 10#)) cs)
-            else '-' : itos' n'# cs
+    | n# <# 0# =
+       let I# minInt# = minInt in
+       if n# ==# minInt#
+               -- negateInt# minInt overflows, so we can't do that:
+          then '-' : itos' (negateInt# (n# `quotInt#` 10#))
+                             (itos' (negateInt# (n# `remInt#` 10#)) cs)
+          else '-' : itos' (negateInt# n#) cs
     | otherwise = itos' n# cs
     where
     itos' :: Int# -> String -> String