-{-# OPTIONS -fno-implicit-prelude #-}
+{-# OPTIONS_GHC -XNoImplicitPrelude #-}
-----------------------------------------------------------------------------
---
--- Module :
+-- |
+-- Module : Data.Word
-- Copyright : (c) The University of Glasgow 2001
--- License : BSD-style (see the file libraries/core/LICENSE)
+-- License : BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer : libraries@haskell.org
-- Stability : experimental
--- Portability : non-portable
---
--- $Id: Word.hs,v 1.1 2001/06/28 14:15:02 simonmar Exp $
+-- Portability : portable
--
--- Sized unsigned integer types.
+-- Unsigned integer types.
--
-----------------------------------------------------------------------------
module Data.Word
- ( Word
- , Word8
- , Word16
- , Word32
- , Word64
- -- instances: Eq, Ord, Num, Bounded, Real, Integral, Ix, Enum, Read,
- -- Show, Bits, CCallable, CReturnable (last two are GHC specific.)
- ) where
+ (
+ -- * Unsigned integral types
+
+ Word,
+ Word8, Word16, Word32, Word64,
+
+ -- * Notes
+
+ -- $notes
+ ) where
#ifdef __GLASGOW_HASKELL__
import GHC.Word
#endif
-import Data.Dynamic
+#ifdef __HUGS__
+import Hugs.Word
+#endif
+
+#ifdef __NHC__
+import NHC.FFI (Word8, Word16, Word32, Word64)
+import NHC.SizedTypes (Word8, Word16, Word32, Word64) -- instances of Bits
+type Word = Word32
+#endif
+
+{- $notes
+
+* All arithmetic is performed modulo 2^n, where n is the number of
+ bits in the type. One non-obvious consequence of this is that 'Prelude.negate'
+ should /not/ raise an error on negative arguments.
+
+* For coercing between any two integer types, use
+ 'Prelude.fromIntegral', which is specialized for all the
+ common cases so should be fast enough. Coercing word types to and
+ from integer types preserves representation, not sign.
+
+* It would be very natural to add a type @Natural@ providing an unbounded
+ size unsigned integer, just as 'Prelude.Integer' provides unbounded
+ size signed integers. We do not do that yet since there is no demand
+ for it.
+
+* The rules that hold for 'Prelude.Enum' instances over a bounded type
+ such as 'Prelude.Int' (see the section of the Haskell report dealing
+ with arithmetic sequences) also hold for the 'Prelude.Enum' instances
+ over the various 'Word' types defined here.
-#include "Dynamic.h"
-INSTANCE_TYPEABLE0(Word8,word8Tc, "Word8" )
-INSTANCE_TYPEABLE0(Word16,word16Tc,"Word16")
-INSTANCE_TYPEABLE0(Word32,word32Tc,"Word32")
-INSTANCE_TYPEABLE0(Word64,word64Tc,"Word64")
+* Right and left shifts by amounts greater than or equal to the width
+ of the type result in a zero result. This is contrary to the
+ behaviour in C, which is undefined; a common interpretation is to
+ truncate the shift count to the width of the type, for example @1 \<\<
+ 32 == 1@ in some C implementations.
+-}