a6c0294227f66c5370adbd825fce1e079c6ae6bc
[ghc-hetmet.git] / ghc / lib / required / Ix.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1994-1996
3 %
4
5 \section[Ix]{Module @Ix@}
6
7 \begin{code}
8 module Ix (
9         Ix(range, index, inRange)
10   ) where
11
12 import Prelude  ()
13 import IOBase   ( error )               {-# SOURCE #-}
14 import PrelNum
15 import PrelTup
16 import PrelBase
17 \end{code}
18
19 %*********************************************************
20 %*                                                      *
21 \subsection{The @Ix@ class}
22 %*                                                      *
23 %*********************************************************
24
25 \begin{code}
26 class  (Show a, Ord a) => Ix a  where
27     range               :: (a,a) -> [a]
28     index               :: (a,a) -> a -> Int
29     inRange             :: (a,a) -> a -> Bool
30 \end{code}
31
32
33 %*********************************************************
34 %*                                                      *
35 \subsection{Instances of @Ix@}
36 %*                                                      *
37 %*********************************************************
38
39 \begin{code}
40 instance  Ix Char  where
41     range (c,c')        =  [c..c']
42     index b@(c,c') ci
43         | inRange b ci  =  fromEnum ci - fromEnum c
44         | otherwise     =  error "LibIx.index: Index out of range."
45     inRange (c,c') ci   =  fromEnum c <= i && i <= fromEnum c'
46                            where i = fromEnum ci
47
48 instance  Ix Int  where
49     range (m,n)         =  [m..n]
50     index b@(m,n) i
51         | inRange b i   =  i - m
52         | otherwise     =  error "LibIx.index: Index out of range."
53     inRange (m,n) i     =  m <= i && i <= n
54
55 instance  Ix Integer  where
56     range (m,n)         =  [m..n]
57     index b@(m,n) i
58         | inRange b i   =  fromInteger (i - m)
59         | otherwise     =  error "LibIx.index: Index out of range."
60     inRange (m,n) i     =  m <= i && i <= n
61
62 ----------------------------------------------------------------------
63 instance Ix Bool where -- as derived
64     range   (l,u)   = map toEnum [fromEnum l .. fromEnum u]
65     index   (l,u) i = fromEnum i - fromEnum l
66     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
67
68 ----------------------------------------------------------------------
69 instance Ix Ordering where -- as derived
70     range   (l,u)   = map toEnum [fromEnum l .. fromEnum u]
71     index   (l,u) i = fromEnum i - fromEnum l
72     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
73
74
75 ----------------------------------------------------------------------
76 instance Ix () where
77     {-# INLINE range #-}
78     range   ((), ())    = [()]
79     {-# INLINE index #-}
80     index   ((), ()) () = 0
81     {-# INLINE inRange #-}
82     inRange ((), ()) () = True
83
84 ----------------------------------------------------------------------
85 instance (Ix a, Ix b) => Ix (a, b) where -- as derived
86     {-# INLINE range #-}
87     range ((l1,l2),(u1,u2))
88       = [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
89
90     {-# INLINE index #-}
91     index ((l1,l2),(u1,u2)) (i1,i2)
92       = index (l1,u1) i1 * (index (l2,u2) u2 + (I# 1#)){-rangeSize (l2,u2)-} + index (l2,u2) i2
93
94     {-# INLINE inRange #-}
95     inRange ((l1,l2),(u1,u2)) (i1,i2)
96       = inRange (l1,u1) i1 && inRange (l2,u2) i2
97
98 instance  (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3)  where
99     range ((l1,l2,l3),(u1,u2,u3)) =
100         [(i1,i2,i3) | i1 <- range (l1,u1),
101                       i2 <- range (l2,u2),
102                       i3 <- range (l3,u3)]
103
104     index ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
105       index (l3,u3) i3 + rangeSize (l3,u3) * (
106        index (l2,u2) i2 + rangeSize (l2,u2) * (
107          index (l1,u1) i1))
108       where
109         rangeSize (l,u) = index (l,u) u + (1 :: Int)
110
111     inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
112         inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
113             inRange (l3,u3) i3
114
115 instance  (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4)  where
116     range ((l1,l2,l3,l4),(u1,u2,u3,u4)) =
117         [(i1,i2,i3,i4) | i1 <- range (l1,u1),
118                          i2 <- range (l2,u2),
119                          i3 <- range (l3,u3),
120                          i4 <- range (l4,u4)]
121
122     index ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
123       index (l4,u4) i4 + rangeSize (l4,u4) * (
124        index (l3,u3) i3 + rangeSize (l3,u3) * (
125          index (l2,u2) i2 + rangeSize (l2,u2) * (
126            index (l1,u1) i1)))
127       where
128         rangeSize (l,u) = index (l,u) u + (1 :: Int)
129
130     inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
131         inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
132            inRange (l3,u3) i3 && inRange (l4,u4) i4
133
134 instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1,a2,a3,a4,a5)  where
135     range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =
136         [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),
137                             i2 <- range (l2,u2),
138                             i3 <- range (l3,u3),
139                             i4 <- range (l4,u4),
140                             i5 <- range (l5,u5)]
141
142     index ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
143       index (l5,u5) i5 + rangeSize (l5,u5) * (
144         index (l4,u4) i4 + rangeSize (l4,u4) * (
145          index (l3,u3) i3 + rangeSize (l3,u3) * (
146            index (l2,u2) i2 + rangeSize (l2,u2) * (
147              index (l1,u1) i1))))
148       where
149         rangeSize (l,u) = index (l,u) u + (1 :: Int)
150
151     inRange ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
152         inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
153             inRange (l3,u3) i3 && inRange (l4,u4) i4 && inRange (l5,u5) i5
154 \end{code}