----------------------------------------------------------------------
instance Ix Char where
- range (m,n)
- | m <= n = [m..n]
- | otherwise = []
+ {-# INLINE range #-}
+ range (m,n) = [m..n]
+ {-# INLINE unsafeIndex #-}
unsafeIndex (m,n) i = fromEnum i - fromEnum m
index b i | inRange b i = unsafeIndex b i
----------------------------------------------------------------------
instance Ix Int where
- range (m,n)
- | m <= n = [m..n]
- | otherwise = []
+ {-# INLINE range #-}
+ -- The INLINE stops the build in the RHS from getting inlined,
+ -- so that callers can fuse with the result of range
+ range (m,n) = [m..n]
+ {-# INLINE unsafeIndex #-}
unsafeIndex (m,n) i = i - m
index b i | inRange b i = unsafeIndex b i
----------------------------------------------------------------------
instance Ix Integer where
- range (m,n)
- | m <= n = [m..n]
- | otherwise = []
+ {-# INLINE range #-}
+ range (m,n) = [m..n]
+ {-# INLINE unsafeIndex #-}
unsafeIndex (m,n) i = fromInteger (i - m)
index b i | inRange b i = unsafeIndex b i
----------------------------------------------------------------------
instance Ix Bool where -- as derived
- range (l,u)
- | l <= u = map toEnum [fromEnum l .. fromEnum u]
- | otherwise = []
+ {-# INLINE range #-}
+ range (m,n) = [m..n]
+ {-# INLINE unsafeIndex #-}
unsafeIndex (l,_) i = fromEnum i - fromEnum l
index b i | inRange b i = unsafeIndex b i
----------------------------------------------------------------------
instance Ix Ordering where -- as derived
- range (l,u)
- | l <= u = map toEnum [fromEnum l .. fromEnum u]
- | otherwise = []
+ {-# INLINE range #-}
+ range (m,n) = [m..n]
+
+ {-# INLINE unsafeIndex #-}
unsafeIndex (l,_) i = fromEnum i - fromEnum l
+
index b i | inRange b i = unsafeIndex b i
| otherwise = indexError b i "Ordering"
+
inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
----------------------------------------------------------------------