ref: 747bad07c02e0d2855ab1d2d1c5db19f7181464c
dir: /lib/Numeric/Show.hs/
module Numeric.Show(
showSigned,
showIntAtBase,
showInt,
showBin,
showHex,
showOct,
showIntegral,
) where
import Prelude() -- do not import Prelude
import Primitives
import Control.Error
import Data.Bool
import Data.Char
import Data.Eq
import Data.Function
import Data.Integral
import Data.List
import Data.Num
import Data.Ord
import Text.Show(ShowS, showChar)
showSigned :: forall a . (Ord a, Integral a) => (a -> ShowS) -> Int -> a -> ShowS
showSigned showPos p n r
| n < 0 =
if p > (6::Int) then
'(' : '-' : showPos (-n) (')' : r)
else
'-' : showPos (-n) r
| otherwise = showPos n r
-- | Shows a /non-negative/ 'Integral' number using the base specified by the
-- first argument, and the character representation specified by the second.
-- If the argument, n, is <0 and -n == n (i.e., n == minBound) it will
-- return the string for (abs n).
showIntAtBase :: forall a . (Ord a, Integral a) => a -> (Int -> Char) -> a -> ShowS
showIntAtBase base toChr an
| base <= 1 = error "Numeric.showIntAtBase: unsupported base"
| an < 0 =
if -an < 0 then
-- We are at minBound
showPos (- quot an base) . showPos (- rem an base)
else
error "Numeric.showIntAtBase: negative argument"
| otherwise = showPos an
where
showPos n r =
let
c = toChr (fromIntegral (rem n base))
in c `seq`
if n < base then
c : r
else
showPos (quot n base) (c : r)
showInt :: forall a . (Ord a, Integral a) => a -> ShowS
showInt = showIntAtBase 10 intToDigit
showHex :: forall a . (Ord a, Integral a) => a -> ShowS
showHex = showIntAtBase 16 intToDigit
showOct :: forall a . (Ord a, Integral a) => a -> ShowS
showOct = showIntAtBase 8 intToDigit
showBin :: forall a . (Ord a, Integral a) => a -> ShowS
showBin = showIntAtBase 2 intToDigit
showIntegral :: forall a . (Ord a, Integral a) => Int -> a -> ShowS
showIntegral = showSigned showInt