1 module Ix ( Ix(range, index, inRange) ) where
3 class (Show a, Ord a) => Ix a where
5 index :: (a,a) -> a -> Int
6 inRange :: (a,a) -> a -> Bool
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'
20 | otherwise = error "LibIx.index: Index out of range."
21 inRange (m,n) i = m <= i && i <= n
23 instance Ix Integer where
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
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
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
43 ----------------------------------------------------------------------
49 {-# INLINE inRange #-}
50 inRange ((), ()) () = True
52 ----------------------------------------------------------------------
53 instance (Ix a, Ix b) => Ix (a, b) where -- as derived
55 range ((l1,l2),(u1,u2))
56 = [ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
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
62 {-# INLINE inRange #-}
63 inRange ((l1,l2),(u1,u2)) (i1,i2)
64 = inRange (l1,u1) i1 && inRange (l2,u2) i2
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),
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) * (
77 rangeSize (l,u) = index (l,u) u + (1 :: Int)
79 inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
80 inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
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),
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) * (
96 rangeSize (l,u) = index (l,u) u + (1 :: Int)
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
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),
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) * (
117 rangeSize (l,u) = index (l,u) u + (1 :: Int)
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