2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Ix]{Module @Ix@}
9 Ix(range, index, inRange)
13 import IOBase ( error ) {-# SOURCE #-}
19 %*********************************************************
21 \subsection{The @Ix@ class}
23 %*********************************************************
26 class (Show a, Ord a) => Ix a where
28 index :: (a,a) -> a -> Int
29 inRange :: (a,a) -> a -> Bool
33 %*********************************************************
35 \subsection{Instances of @Ix@}
37 %*********************************************************
40 instance Ix Char where
41 range (c,c') = [c..c']
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'
52 | otherwise = error "LibIx.index: Index out of range."
53 inRange (m,n) i = m <= i && i <= n
55 instance Ix Integer where
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
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
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
75 ----------------------------------------------------------------------
81 {-# INLINE inRange #-}
82 inRange ((), ()) () = True
84 ----------------------------------------------------------------------
85 instance (Ix a, Ix b) => Ix (a, b) where -- as derived
87 range ((l1,l2),(u1,u2))
88 = [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
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
94 {-# INLINE inRange #-}
95 inRange ((l1,l2),(u1,u2)) (i1,i2)
96 = inRange (l1,u1) i1 && inRange (l2,u2) i2
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),
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) * (
109 rangeSize (l,u) = index (l,u) u + (1 :: Int)
111 inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
112 inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
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),
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) * (
128 rangeSize (l,u) = index (l,u) u + (1 :: Int)
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
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),
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) * (
149 rangeSize (l,u) = index (l,u) u + (1 :: Int)
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