ref: 37a178d694b1d62b93c38ea883c9b2df2c632f25
dir: /lib/Data/Ix.hs/
module Data.Ix(Ix(..)) where
import Prelude()
import Control.Error
import Data.Bool
import Data.Char
import Data.Enum
import Data.Int
import Data.Integer
import Data.Integral
import Data.List
import Data.Num
import Data.Ord
import Data.Tuple
import Data.Word
class Ord a => Ix a where
range :: (a, a) -> [a]
index :: (a, a) -> a -> Int
inRange :: (a, a) -> a -> Bool
rangeSize :: (a, a) -> Int
unsafeIndex :: (a, a) -> a -> Int
unsafeRangeSize :: (a, a) -> Int
index b i | inRange b i = unsafeIndex b i
| otherwise = error "Ix.index: out of bound"
rangeSize b@(_l,h) | inRange b h = unsafeIndex b h + 1
| otherwise = 0
unsafeRangeSize b@(_l,h) = unsafeIndex b h + 1
instance Ix Int where
range (m,n) = [m..n]
unsafeIndex (m,_n) i = i - m
inRange (m, n) i = m <= i && i <= n
instance Ix Integer where
range (m,n) = [m..n]
unsafeIndex (m,_n) i = fromInteger (i - m)
inRange (m, n) i = m <= i && i <= n
instance Ix Word where
range (m,n) = [m..n]
unsafeIndex (m,_n) i = fromIntegral (i - m)
inRange (m, n) i = m <= i && i <= n
instance Ix Word8 where
range (m,n) = [m..n]
unsafeIndex (m,_n) i = fromIntegral (i - m)
inRange (m, n) i = m <= i && i <= n
instance Ix Bool where
range (m,n) = [m..n]
unsafeIndex (m,_n) i = fromEnum i - fromEnum m
inRange (m, n) i = m <= i && i <= n
instance Ix Char where
range (m,n) = [m..n]
unsafeIndex (m,_n) i = fromEnum i - fromEnum m
inRange (m, n) i = m <= i && i <= n
instance Ix () where
range ((),()) = [()]
unsafeIndex ((),_n) () = 0
inRange ((), ()) () = True
instance Ix a => Ix (Solo a) where -- as derived
range (MkSolo l, MkSolo u) =
[ MkSolo i | i <- range (l,u) ]
unsafeIndex (MkSolo l, MkSolo u) (MkSolo i) =
unsafeIndex (l,u) i
inRange (MkSolo l, MkSolo u) (MkSolo i) =
inRange (l, u) i
instance (Ix a, Ix b) => Ix (a, b) where -- as derived
range ((l1,l2),(u1,u2)) =
[ (i1,i2) | i1 <- range (l1,u1), i2 <- range (l2,u2) ]
unsafeIndex ((l1,l2),(u1,u2)) (i1,i2) =
unsafeIndex (l1,u1) i1 * unsafeRangeSize (l2,u2) + unsafeIndex (l2,u2) i2
inRange ((l1,l2),(u1,u2)) (i1,i2) =
inRange (l1,u1) i1 && inRange (l2,u2) i2
instance (Ix a1, Ix a2, Ix a3) => Ix (a1,a2,a3) where
range ((l1,l2,l3),(u1,u2,u3)) =
[(i1,i2,i3) | i1 <- range (l1,u1),
i2 <- range (l2,u2),
i3 <- range (l3,u3)]
unsafeIndex ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
unsafeIndex (l1,u1) i1))
inRange ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
inRange (l3,u3) i3
instance (Ix a1, Ix a2, Ix a3, Ix a4) => Ix (a1,a2,a3,a4) where
range ((l1,l2,l3,l4),(u1,u2,u3,u4)) =
[(i1,i2,i3,i4) | i1 <- range (l1,u1),
i2 <- range (l2,u2),
i3 <- range (l3,u3),
i4 <- range (l4,u4)]
unsafeIndex ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
unsafeIndex (l4,u4) i4 + unsafeRangeSize (l4,u4) * (
unsafeIndex (l3,u3) i3 + unsafeRangeSize (l3,u3) * (
unsafeIndex (l2,u2) i2 + unsafeRangeSize (l2,u2) * (
unsafeIndex (l1,u1) i1)))
inRange ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
inRange (l1,u1) i1 && inRange (l2,u2) i2 &&
inRange (l3,u3) i3 && inRange (l4,u4) i4