% -----------------------------------------------------------------------------
-% $Id: Numeric.lhs,v 1.13 2001/02/28 00:01:03 qrczak Exp $
+% $Id: Numeric.lhs,v 1.14 2002/02/01 11:31:27 simonmar Exp $
%
% (c) The University of Glasgow, 1997-2000
%
( fromRat -- :: (RealFloat a) => Rational -> a
, showSigned -- :: (Real a) => (a -> ShowS) -> Int -> a -> ShowS
, readSigned -- :: (Real a) => ReadS a -> ReadS a
- , showInt -- :: Integral a => a -> ShowS
+
, readInt -- :: (Integral a) => a -> (Char -> Bool) -> (Char -> Int) -> ReadS a
-
, readDec -- :: (Integral a) => ReadS a
, readOct -- :: (Integral a) => ReadS a
, readHex -- :: (Integral a) => ReadS a
, showFloat -- :: (RealFloat a) => a -> ShowS
, readFloat -- :: (RealFloat a) => ReadS a
-
+ , showInt -- :: Integral a => a -> ShowS
+ , showIntAtBase -- :: Integral a => a -> (a -> Char) -> a -> ShowS
+ , showHex -- :: Integral a => a -> ShowS
+ , showOct -- :: Integral a => a -> ShowS
+ , showBin -- :: Integral a => a -> ShowS
+
, floatToDigits -- :: (RealFloat a) => Integer -> a -> ([Int], Int)
, lexDigits -- :: ReadS String
-
- -- Implementation checked wrt. Haskell 98 lib report, 1/99.
) where
import Char
showEFloat d x = showString (formatRealFloat FFExponent d x)
showFFloat d x = showString (formatRealFloat FFFixed d x)
showGFloat d x = showString (formatRealFloat FFGeneric d x)
+\end{code}
+\begin{code}
+showIntAtBase :: Integral a => a -> (a -> Char) -> a -> ShowS
+showIntAtBase base toChr n r
+ | n < 0 = error ("NumExts.showIntAtBase: applied to negative number " ++ show n)
+ | otherwise =
+ case quotRem n base of { (n', d) ->
+ let c = toChr d in
+ c `seq` -- stricter than necessary
+ let
+ r' = c : r
+ in
+ if n' == 0 then r' else showIntAtBase base toChr n' r'
+ }
+
+showHex :: Integral a => a -> ShowS
+showHex n r =
+ showString "0x" $
+ showIntAtBase 16 (toChrHex) n r
+ where
+ toChrHex d
+ | d < 10 = chr (ord '0' + fromIntegral d)
+ | otherwise = chr (ord 'a' + fromIntegral (d - 10))
+
+showOct :: Integral a => a -> ShowS
+showOct n r =
+ showString "0o" $
+ showIntAtBase 8 (toChrOct) n r
+ where toChrOct d = chr (ord '0' + fromIntegral d)
+
+showBin :: Integral a => a -> ShowS
+showBin n r =
+ showString "0b" $
+ showIntAtBase 2 (toChrOct) n r
+ where toChrOct d = chr (ord '0' + fromIntegral d)
\end{code}
-#else
+#else
%*********************************************************
%* *