5a1f522bbb441662dbac47bf067afe6c67a9ca9b
[ghc-hetmet.git] / ghc / lib / required / Ix.hs
1 module Ix ( Ix(range, index, inRange) ) where
2
3 class  (Show a, Ord a) => Ix a  where
4     range               :: (a,a) -> [a]
5     index               :: (a,a) -> a -> Int
6     inRange             :: (a,a) -> a -> Bool
7
8 instance  Ix Char  where
9     range (c,c')        =  [c..c']
10     index b@(c,c') ci
11         | inRange b ci  =  fromEnum ci - fromEnum c
12         | otherwise     =  error "LibIx.index: Index out of range."
13     inRange (c,c') ci   =  fromEnum c <= i && i <= fromEnum c'
14                            where i = fromEnum ci
15
16 instance  Ix Int  where
17     range (m,n)         =  [m..n]
18     index b@(m,n) i
19         | inRange b i   =  i - m
20         | otherwise     =  error "LibIx.index: Index out of range."
21     inRange (m,n) i     =  m <= i && i <= n
22
23 instance  Ix Integer  where
24     range (m,n)         =  [m..n]
25     index b@(m,n) i
26         | inRange b i   =  fromInteger (i - m)
27         | otherwise     =  error "LibIx.index: Index out of range."
28     inRange (m,n) i     =  m <= i && i <= n
29
30 ----------------------------------------------------------------------
31 instance Ix Bool where -- as derived
32     range   (l,u)   = map toEnum [fromEnum l .. fromEnum u]
33     index   (l,u) i = fromEnum i - fromEnum l
34     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
35
36 ----------------------------------------------------------------------
37 instance Ix Ordering where -- as derived
38     range   (l,u)   = map toEnum [fromEnum l .. fromEnum u]
39     index   (l,u) i = fromEnum i - fromEnum l
40     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
41
42
43 ----------------------------------------------------------------------
44 instance Ix () where
45     {-# INLINE range #-}
46     range   ((), ())    = [()]
47     {-# INLINE index #-}
48     index   ((), ()) () = 0
49     {-# INLINE inRange #-}
50     inRange ((), ()) () = True
51
52 ----------------------------------------------------------------------
53 instance (Ix a, Ix b) => Ix (a, b) where -- as derived
54     {-# INLINE range #-}
55     range ((l1,l2),(u1,u2))
56       = [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
57
58     {-# INLINE index #-}
59     index ((l1,l2),(u1,u2)) (i1,i2)
60       = index (l1,u1) i1 * (index (l2,u2) u2 + (I# 1#)){-rangeSize (l2,u2)-} + index (l2,u2) i2
61
62     {-# INLINE inRange #-}
63     inRange ((l1,l2),(u1,u2)) (i1,i2)
64       = inRange (l1,u1) i1 && inRange (l2,u2) i2
65
66 instance  (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3)  where
67     range ((l1,l2,l3),(u1,u2,u3)) =
68         [(i1,i2,i3) | i1 <- range (l1,u1),
69                       i2 <- range (l2,u2),
70                       i3 <- range (l3,u3)]
71
72     index ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
73       index (l3,u3) i3 + rangeSize (l3,u3) * (
74        index (l2,u2) i2 + rangeSize (l2,u2) * (
75          index (l1,u1) i1))
76       where
77         rangeSize (l,u) = index (l,u) u + (1 :: Int)
78
79     inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
80         inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
81             inRange (l3,u3) i3
82
83 instance  (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4)  where
84     range ((l1,l2,l3,l4),(u1,u2,u3,u4)) =
85         [(i1,i2,i3,i4) | i1 <- range (l1,u1),
86                          i2 <- range (l2,u2),
87                          i3 <- range (l3,u3),
88                          i4 <- range (l4,u4)]
89
90     index ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
91       index (l4,u4) i4 + rangeSize (l4,u4) * (
92        index (l3,u3) i3 + rangeSize (l3,u3) * (
93          index (l2,u2) i2 + rangeSize (l2,u2) * (
94            index (l1,u1) i1)))
95       where
96         rangeSize (l,u) = index (l,u) u + (1 :: Int)
97
98     inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
99         inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
100            inRange (l3,u3) i3 && inRange (l4,u4) i4
101
102 instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1,a2,a3,a4,a5)  where
103     range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =
104         [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),
105                             i2 <- range (l2,u2),
106                             i3 <- range (l3,u3),
107                             i4 <- range (l4,u4),
108                             i5 <- range (l5,u5)]
109
110     index ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
111       index (l5,u5) i5 + rangeSize (l5,u5) * (
112         index (l4,u4) i4 + rangeSize (l4,u4) * (
113          index (l3,u3) i3 + rangeSize (l3,u3) * (
114            index (l2,u2) i2 + rangeSize (l2,u2) * (
115              index (l1,u1) i1))))
116       where
117         rangeSize (l,u) = index (l,u) u + (1 :: Int)
118
119     inRange ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
120         inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
121             inRange (l3,u3) i3 && inRange (l4,u4) i4 && inRange (l5,u5) i5