add GHC.HetMet.{hetmet_kappa,hetmet_kappa_app}
[ghc-base.git] / Data / Word.hs
index c739716..18300d2 100644 (file)
@@ -1,38 +1,69 @@
-{-# OPTIONS -fno-implicit-prelude #-}
+{-# LANGUAGE CPP, NoImplicitPrelude #-}
+
 -----------------------------------------------------------------------------
--- 
--- 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 :  portable
 --
--- $Id: Word.hs,v 1.2 2001/07/03 11:37:50 simonmar Exp $
---
--- 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. 
+-}