shithub: MicroHs

ref: 63b1cd19101d0f5f566abdd67f305cc4e198e370
dir: /lib/Data/Ix.hs/

View raw version
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