{- | Implementations of 'Ix' methods in terms of 'Enum' methods. For a type @T@ of class 'Enum' you can easily define an 'Ix' instance by copying the following code into your module: >import qualified Data.Ix.Enum as IxEnum > >instance Ix T where > range = IxEnum.range > index = IxEnum.index > inRange = IxEnum.inRange > rangeSize = IxEnum.rangeSize > unsafeIndex = IxEnum.unsafeIndex > unsafeRangeSize = IxEnum.unsafeRangeSize -} module Data.Ix.Enum where {-# INLINE range #-} {-# INLINE index #-} {-# INLINE unsafeIndex #-} {-# INLINE inRange #-} {-# INLINE rangeSize #-} {-# INLINE unsafeRangeSize #-} range :: Enum a => (a, a) -> [a] index :: Enum a => (a, a) -> a -> Int unsafeIndex :: Enum a => (a, a) -> a -> Int inRange :: Enum a => (a, a) -> a -> Bool rangeSize :: Enum a => (a, a) -> Int unsafeRangeSize :: Enum a => (a, a) -> Int range (l,r) = map toEnum $ range (fromEnum l, fromEnum r) index (l,r) i = index (fromEnum l, fromEnum r) (fromEnum i) unsafeIndex (l,r) i = unsafeIndex (fromEnum l, fromEnum r) (fromEnum i) inRange (l,r) i = inRange (fromEnum l, fromEnum r) (fromEnum i) rangeSize (l,r) = rangeSize (fromEnum l, fromEnum r) unsafeRangeSize (l,r) = unsafeRangeSize (fromEnum l, fromEnum r)