[project @ 1997-03-14 05:22:26 by sof]
[ghc-hetmet.git] / ghc / lib / required / Ix.lhs
index c68546f..afafe24 100644 (file)
@@ -7,12 +7,13 @@
 \begin{code}
 {-# OPTIONS -fno-implicit-prelude #-}
 
-module Ix (
-       Ix(range, index, inRange)
-  ) where
+module Ix 
+    (
+       Ix(range, index, inRange),
+       rangeSize
+    ) where
 
 import {-# SOURCE #-}  IOBase  ( error )
-import PrelNum
 import PrelTup
 import PrelBase
 \end{code}
@@ -42,7 +43,10 @@ instance  Ix Char  where
     range (c,c')       =  [c..c']
     index b@(c,c') ci
        | inRange b ci  =  fromEnum ci - fromEnum c
-       | otherwise     =  error "LibIx.index: Index out of range."
+       | otherwise     =  error (showString "Ix{Char}.index: Index " .
+                                 showParen True (showsPrec 0 ci) .
+                                 showString " out of range " $
+                                 showParen True (showsPrec 0 b) "")
     inRange (c,c') ci  =  fromEnum c <= i && i <= fromEnum c'
                           where i = fromEnum ci
 
@@ -50,15 +54,13 @@ instance  Ix Int  where
     range (m,n)                =  [m..n]
     index b@(m,n) i
        | inRange b i   =  i - m
-       | otherwise     =  error "LibIx.index: Index out of range."
+       | otherwise     =  error (showString "Ix{Int}.index: Index " .
+                                 showParen True (showsPrec 0 i) .
+                                  showString " out of range " $
+                                 showParen True (showsPrec 0 b) "")
     inRange (m,n) i    =  m <= i && i <= n
 
-instance  Ix Integer  where
-    range (m,n)                =  [m..n]
-    index b@(m,n) i
-       | inRange b i   =  fromInteger (i - m)
-       | otherwise     =  error "LibIx.index: Index out of range."
-    inRange (m,n) i    =  m <= i && i <= n
+-- Integer instance is in PrelNum
 
 ----------------------------------------------------------------------
 instance Ix Bool where -- as derived
@@ -72,7 +74,6 @@ instance Ix Ordering where -- as derived
     index   (l,u) i = fromEnum i - fromEnum l
     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
 
-
 ----------------------------------------------------------------------
 instance Ix () where
     {-# INLINE range #-}
@@ -85,16 +86,16 @@ instance Ix () where
 ----------------------------------------------------------------------
 instance (Ix a, Ix b) => Ix (a, b) where -- as derived
     {-# INLINE range #-}
-    range ((l1,l2),(u1,u2))
-      = [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
+    range ((l1,l2),(u1,u2)) =
+      [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
 
     {-# INLINE index #-}
-    index ((l1,l2),(u1,u2)) (i1,i2)
-      = index (l1,u1) i1 * (index (l2,u2) u2 + (I# 1#)){-rangeSize (l2,u2)-} + index (l2,u2) i2
+    index ((l1,l2),(u1,u2)) (i1,i2) =
+      index (l1,u1) i1 * rangeSize (l2,u2) + index (l2,u2) i2
 
     {-# INLINE inRange #-}
-    inRange ((l1,l2),(u1,u2)) (i1,i2)
-      = inRange (l1,u1) i1 && inRange (l2,u2) i2
+    inRange ((l1,l2),(u1,u2)) (i1,i2) =
+      inRange (l1,u1) i1 && inRange (l2,u2) i2
 
 instance  (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3)  where
     range ((l1,l2,l3),(u1,u2,u3)) =
@@ -104,52 +105,62 @@ instance  (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3)  where
 
     index ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
       index (l3,u3) i3 + rangeSize (l3,u3) * (
-       index (l2,u2) i2 + rangeSize (l2,u2) * (
-         index (l1,u1) i1))
-      where
-       rangeSize (l,u) = index (l,u) u + (1 :: Int)
+      index (l2,u2) i2 + rangeSize (l2,u2) * (
+      index (l1,u1) i1))
 
     inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
-        inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
-            inRange (l3,u3) i3
+      inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+      inRange (l3,u3) i3
 
 instance  (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4)  where
     range ((l1,l2,l3,l4),(u1,u2,u3,u4)) =
-        [(i1,i2,i3,i4) | i1 <- range (l1,u1),
-                         i2 <- range (l2,u2),
-                         i3 <- range (l3,u3),
-                         i4 <- range (l4,u4)]
+      [(i1,i2,i3,i4) | i1 <- range (l1,u1),
+                       i2 <- range (l2,u2),
+                       i3 <- range (l3,u3),
+                       i4 <- range (l4,u4)]
 
     index ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
       index (l4,u4) i4 + rangeSize (l4,u4) * (
-       index (l3,u3) i3 + rangeSize (l3,u3) * (
-         index (l2,u2) i2 + rangeSize (l2,u2) * (
-           index (l1,u1) i1)))
-      where
-       rangeSize (l,u) = index (l,u) u + (1 :: Int)
+      index (l3,u3) i3 + rangeSize (l3,u3) * (
+      index (l2,u2) i2 + rangeSize (l2,u2) * (
+      index (l1,u1) i1)))
 
     inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
-        inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
-           inRange (l3,u3) i3 && inRange (l4,u4) i4
+      inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+      inRange (l3,u3) i3 && inRange (l4,u4) i4
 
 instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1,a2,a3,a4,a5)  where
     range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =
-        [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),
-                            i2 <- range (l2,u2),
-                            i3 <- range (l3,u3),
-                            i4 <- range (l4,u4),
-                            i5 <- range (l5,u5)]
+      [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),
+                          i2 <- range (l2,u2),
+                          i3 <- range (l3,u3),
+                          i4 <- range (l4,u4),
+                          i5 <- range (l5,u5)]
 
     index ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
       index (l5,u5) i5 + rangeSize (l5,u5) * (
-        index (l4,u4) i4 + rangeSize (l4,u4) * (
-         index (l3,u3) i3 + rangeSize (l3,u3) * (
-           index (l2,u2) i2 + rangeSize (l2,u2) * (
-             index (l1,u1) i1))))
-      where
-       rangeSize (l,u) = index (l,u) u + (1 :: Int)
+      index (l4,u4) i4 + rangeSize (l4,u4) * (
+      index (l3,u3) i3 + rangeSize (l3,u3) * (
+      index (l2,u2) i2 + rangeSize (l2,u2) * (
+      index (l1,u1) i1))))
 
     inRange ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
-        inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
-            inRange (l3,u3) i3 && inRange (l4,u4) i4 && inRange (l5,u5) i5
+      inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
+      inRange (l3,u3) i3 && inRange (l4,u4) i4 && 
+      inRange (l5,u5) i5
+\end{code}
+
+%********************************************************
+%*                                                     *
+\subsection{Size of @Ix@ interval}
+%*                                                     *
+%********************************************************
+
+The @rangeSize@ operator returns the number of elements
+in the range for an @Ix@ pair:
+
+\begin{code}
+rangeSize :: (Ix a) => (a,a) -> Int
+rangeSize b@(_,high) = index b high + 1
+
 \end{code}