2 % (c) The AQUA Project, Glasgow University, 1994-1996
5 \section[Ix]{Module @Ix@}
8 {-# OPTIONS -fno-implicit-prelude #-}
11 Ix(range, index, inRange)
14 import {-# SOURCE #-} IOBase ( error )
20 %*********************************************************
22 \subsection{The @Ix@ class}
24 %*********************************************************
27 class (Show a, Ord a) => Ix a where
29 index :: (a,a) -> a -> Int
30 inRange :: (a,a) -> a -> Bool
34 %*********************************************************
36 \subsection{Instances of @Ix@}
38 %*********************************************************
41 instance Ix Char where
42 range (c,c') = [c..c']
44 | inRange b ci = fromEnum ci - fromEnum c
45 | otherwise = error "LibIx.index: Index out of range."
46 inRange (c,c') ci = fromEnum c <= i && i <= fromEnum c'
53 | otherwise = error "LibIx.index: Index out of range."
54 inRange (m,n) i = m <= i && i <= n
56 instance Ix Integer where
59 | inRange b i = fromInteger (i - m)
60 | otherwise = error "LibIx.index: Index out of range."
61 inRange (m,n) i = m <= i && i <= n
63 ----------------------------------------------------------------------
64 instance Ix Bool where -- as derived
65 range (l,u) = map toEnum [fromEnum l .. fromEnum u]
66 index (l,u) i = fromEnum i - fromEnum l
67 inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
69 ----------------------------------------------------------------------
70 instance Ix Ordering where -- as derived
71 range (l,u) = map toEnum [fromEnum l .. fromEnum u]
72 index (l,u) i = fromEnum i - fromEnum l
73 inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
76 ----------------------------------------------------------------------
82 {-# INLINE inRange #-}
83 inRange ((), ()) () = True
85 ----------------------------------------------------------------------
86 instance (Ix a, Ix b) => Ix (a, b) where -- as derived
88 range ((l1,l2),(u1,u2))
89 = [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
92 index ((l1,l2),(u1,u2)) (i1,i2)
93 = index (l1,u1) i1 * (index (l2,u2) u2 + (I# 1#)){-rangeSize (l2,u2)-} + index (l2,u2) i2
95 {-# INLINE inRange #-}
96 inRange ((l1,l2),(u1,u2)) (i1,i2)
97 = inRange (l1,u1) i1 && inRange (l2,u2) i2
99 instance (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3) where
100 range ((l1,l2,l3),(u1,u2,u3)) =
101 [(i1,i2,i3) | i1 <- range (l1,u1),
105 index ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
106 index (l3,u3) i3 + rangeSize (l3,u3) * (
107 index (l2,u2) i2 + rangeSize (l2,u2) * (
110 rangeSize (l,u) = index (l,u) u + (1 :: Int)
112 inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
113 inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
116 instance (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4) where
117 range ((l1,l2,l3,l4),(u1,u2,u3,u4)) =
118 [(i1,i2,i3,i4) | i1 <- range (l1,u1),
123 index ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
124 index (l4,u4) i4 + rangeSize (l4,u4) * (
125 index (l3,u3) i3 + rangeSize (l3,u3) * (
126 index (l2,u2) i2 + rangeSize (l2,u2) * (
129 rangeSize (l,u) = index (l,u) u + (1 :: Int)
131 inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
132 inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
133 inRange (l3,u3) i3 && inRange (l4,u4) i4
135 instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) => Ix (a1,a2,a3,a4,a5) where
136 range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =
137 [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),
143 index ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
144 index (l5,u5) i5 + rangeSize (l5,u5) * (
145 index (l4,u4) i4 + rangeSize (l4,u4) * (
146 index (l3,u3) i3 + rangeSize (l3,u3) * (
147 index (l2,u2) i2 + rangeSize (l2,u2) * (
150 rangeSize (l,u) = index (l,u) u + (1 :: Int)
152 inRange ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
153 inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
154 inRange (l3,u3) i3 && inRange (l4,u4) i4 && inRange (l5,u5) i5