packages feed

hat-2.7.0.0: libraries/Ix.hs

module Ix ( Ix(range, index, inRange, rangeSize) ) where

class Ord a => Ix a  where
    range     :: (a,a) -> [a]
    index     :: (a,a) -> a -> Int
    inRange   :: (a,a) -> a -> Bool
    rangeSize :: (a,a) -> Int

    rangeSize b@(l,h) | null (range b) = 0
                      | otherwise      = index b h + 1 
-- NB: replacing "null (range b)" by  "not (l <= h)"
-- fails if the bounds are tuples.  For example,
--  (1,2) <= (2,1)
-- but the range is nevertheless empty
-- range ((1,2),(2,1)) = []

instance  Ix Char  where
    range (m,n) = [m..n]
    index b@(c,c') ci
        | inRange b ci  =  fromEnum ci - fromEnum c
        | otherwise     =  error "Ix.index: Index out of range."
    inRange (c,c') i    =  c <= i && i <= c'

instance  Ix Int  where
    range (m,n) = [m..n]
    index b@(m,n) i
        | inRange b i   =  i - m
        | otherwise     =  error "Ix.index: Index out of range."
    inRange (m,n) i     =  m <= i && i <= n

instance  Ix Integer  where
    range (m,n) = [m..n]
    index b@(m,n) i
        | inRange b i   =  fromInteger (i - m)
        | otherwise     =  error "Ix.index: Index out of range."
    inRange (m,n) i     =  m <= i && i <= n

instance Ix Bool where
  range (c,c') 	= [c .. c']

  index b@(c,c') ci
	| inRange b ci = fromEnum ci - fromEnum c
	| True         = error "Ix.Bool.index: Index out of range."
  inRange (c,c') ci    = c <= ci && ci <= c'  
  -- Assuming Enum and Ord agree on order for Bool

instance Ix Ordering where
  range (c,c') 	= [c .. c']

  index b@(c,c') ci
	| inRange b ci = fromEnum ci - fromEnum c
	| True         = error "Ix.Ordering.index: Index out of range."
  inRange (c,c') ci    = c <= ci && ci <= c'  
  -- Assuming Enum and Ord agree on order for Ordering

instance Ix () where
  range ((),()) = [()]
  index ((),()) () = 0
  inRange ((),()) () = True

instance  (Ix a, Ix b)  => Ix (a,b) where
         range ((l,l'),(u,u'))
                 = [(i,i') | i <- range (l,u), i' <- range (l',u')]
         index ((l,l'),(u,u')) (i,i')
                 =  index (l,u) i * rangeSize (l',u') + index (l',u') i'
         inRange ((l,l'),(u,u')) (i,i')
                 = inRange (l,u) i && inRange (l',u') i'

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)]

    index ((l1,l2,l3),(u1,u2,u3)) (i1,i2,i3) =
        index (l3,u3) i3 + rangeSize (l3,u3) * (
         index (l2,u2) i2 + rangeSize (l2,u2) * (
           index (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)]

    index ((l1,l2,l3,l4),(u1,u2,u3,u4)) (i1,i2,i3,i4) =
        index (l4,u4) i4 + rangeSize (l4,u4) * (
         index (l3,u3) i3 + rangeSize (l3,u3) * (
           index (l2,u2) i2 + rangeSize (l2,u2) * (
             index (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

instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5) =>
	 Ix (a1,a2,a3,a4,a5)  where
    range ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) =
          [(i1,i2,i3,i4,i5) | i1 <- range (l1,u1),
                              i2 <- range (l2,u2),
                              i3 <- range (l3,u3),
                              i4 <- range (l4,u4),
                              i5 <- range (l5,u5)]

    index ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
        index (l5,u5) i5 + rangeSize (l5,u5) * (
         index (l4,u4) i4 + rangeSize (l4,u4) * (
          index (l3,u3) i3 + rangeSize (l3,u3) * (
           index (l2,u2) i2 + rangeSize (l2,u2) * (
            index (l1,u1) i1))))

    inRange ((l1,l2,l3,l4,l5),(u1,u2,u3,u4,u5)) (i1,i2,i3,i4,i5) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5

instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6) =>
	 Ix (a1,a2,a3,a4,a5,a6)  where
    range ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) =
          [(i1,i2,i3,i4,i5,i6) | i1 <- range (l1,u1),
                                 i2 <- range (l2,u2),
                                 i3 <- range (l3,u3),
                                 i4 <- range (l4,u4),
                                 i5 <- range (l5,u5),
                                 i6 <- range (l6,u6)]

    index ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) (i1,i2,i3,i4,i5,i6) =
        index (l6,u6) i6 + rangeSize (l6,u6) * (
         index (l5,u5) i5 + rangeSize (l5,u5) * (
          index (l4,u4) i4 + rangeSize (l4,u4) * (
           index (l3,u3) i3 + rangeSize (l3,u3) * (
            index (l2,u2) i2 + rangeSize (l2,u2) * (
             index (l1,u1) i1)))))

    inRange ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) (i1,i2,i3,i4,i5,i6) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6

instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7)  where
    range ((l1,l2,l3,l4,l5,l6,l7),(u1,u2,u3,u4,u5,u6,u7)) =
          [(i1,i2,i3,i4,i5,i6,i7) | i1 <- range (l1,u1),
                                    i2 <- range (l2,u2),
                                    i3 <- range (l3,u3),
                                    i4 <- range (l4,u4),
                                    i5 <- range (l5,u5),
                                    i6 <- range (l6,u6),
                                    i7 <- range (l7,u7)]

    index ((l1,l2,l3,l4,l5,l6,l7),(u1,u2,u3,u4,u5,u6,u7)) (i1,i2,i3,i4,i5,i6,i7) =
       index (l7,u7) i7 + rangeSize (l7,u7) * (
        index (l6,u6) i6 + rangeSize (l6,u6) * (
         index (l5,u5) i5 + rangeSize (l5,u5) * (
          index (l4,u4) i4 + rangeSize (l4,u4) * (
           index (l3,u3) i3 + rangeSize (l3,u3) * (
            index (l2,u2) i2 + rangeSize (l2,u2) * (
             index (l1,u1) i1))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7),(u1,u2,u3,u4,u5,u6,u7)) (i1,i2,i3,i4,i5,i6,i7) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7

instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8),(u1,u2,u3,u4,u5,u6,u7,u8)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8) | i1 <- range (l1,u1),
                                    i2 <- range (l2,u2),
                                    i3 <- range (l3,u3),
                                    i4 <- range (l4,u4),
                                    i5 <- range (l5,u5),
                                    i6 <- range (l6,u6),
                                    i7 <- range (l7,u7),
                                    i8 <- range (l8,u8)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8),(u1,u2,u3,u4,u5,u6,u7,u8))
          (i1,i2,i3,i4,i5,i6,i7,i8) =
       index (l8,u8) i8 + rangeSize (l8,u8) * (
        index (l7,u7) i7 + rangeSize (l7,u7) * (
         index (l6,u6) i6 + rangeSize (l6,u6) * (
          index (l5,u5) i5 + rangeSize (l5,u5) * (
           index (l4,u4) i4 + rangeSize (l4,u4) * (
            index (l3,u3) i3 + rangeSize (l3,u3) * (
             index (l2,u2) i2 + rangeSize (l2,u2) * (
              index (l1,u1) i1)))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8),(u1,u2,u3,u4,u5,u6,u7,u8))
            (i1,i2,i3,i4,i5,i6,i7,i8) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8

instance  (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9),(u1,u2,u3,u4,u5,u6,u7,u8,u9)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9),(u1,u2,u3,u4,u5,u6,u7,u8,u9))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9) =
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9),(u1,u2,u3,u4,u5,u6,u7,u8,u9))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9

instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9
	 ,Ix a10) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9),
                           i10 <- range (l10,u10)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10) =
           index (l10,u10) i10 + rangeSize (l10,u10) * (
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1)))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10)
	    ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9
           && inRange (l10,u10) i10

instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9
	 ,Ix a10, Ix a11) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9),
                           i10 <- range (l10,u10),
                           i11 <- range (l11,u11)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11) =
          index (l11,u11) i11 + rangeSize (l11,u11) * (
           index (l10,u10) i10 + rangeSize (l10,u10) * (
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1))))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11)
	    ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9
           && inRange (l10,u10) i10
           && inRange (l11,u11) i11

instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9
	 ,Ix a10, Ix a11, Ix a12) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9),
                           i10 <- range (l10,u10),
                           i11 <- range (l11,u11),
                           i12 <- range (l12,u12)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12) =
         index (l12,u12) i12 + rangeSize (l12,u12) * (
          index (l11,u11) i11 + rangeSize (l11,u11) * (
           index (l10,u10) i10 + rangeSize (l10,u10) * (
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1)))))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12)
	    ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9
           && inRange (l10,u10) i10
           && inRange (l11,u11) i11
           && inRange (l12,u12) i12

instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9
	 ,Ix a10, Ix a11, Ix a12, Ix a13) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9),
                           i10 <- range (l10,u10),
                           i11 <- range (l11,u11),
                           i12 <- range (l12,u12),
                           i13 <- range (l13,u13)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13) =
        index (l13,u13) i13 + rangeSize (l13,u13) * (
         index (l12,u12) i12 + rangeSize (l12,u12) * (
          index (l11,u11) i11 + rangeSize (l11,u11) * (
           index (l10,u10) i10 + rangeSize (l10,u10) * (
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1))))))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13)
	    ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9
           && inRange (l10,u10) i10
           && inRange (l11,u11) i11
           && inRange (l12,u12) i12
           && inRange (l13,u13) i13

instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9
	 ,Ix a10, Ix a11, Ix a12, Ix a13, Ix a14) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9),
                           i10 <- range (l10,u10),
                           i11 <- range (l11,u11),
                           i12 <- range (l12,u12),
                           i13 <- range (l13,u13),
                           i14 <- range (l14,u14)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14) =
       index (l14,u14) i14 + rangeSize (l14,u14) * (
        index (l13,u13) i13 + rangeSize (l13,u13) * (
         index (l12,u12) i12 + rangeSize (l12,u12) * (
          index (l11,u11) i11 + rangeSize (l11,u11) * (
           index (l10,u10) i10 + rangeSize (l10,u10) * (
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1)))))))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14)
	    ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9
           && inRange (l10,u10) i10
           && inRange (l11,u11) i11
           && inRange (l12,u12) i12
           && inRange (l13,u13) i13
           && inRange (l14,u14) i14

instance (Ix a1, Ix a2, Ix a3, Ix a4, Ix a5, Ix a6, Ix a7, Ix a8, Ix a9
	 ,Ix a10, Ix a11, Ix a12, Ix a13, Ix a14, Ix a15) =>
	 Ix (a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15)  where
    range ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15)) =
          [(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15)
			 | i1 <- range (l1,u1),
                           i2 <- range (l2,u2),
                           i3 <- range (l3,u3),
                           i4 <- range (l4,u4),
                           i5 <- range (l5,u5),
                           i6 <- range (l6,u6),
                           i7 <- range (l7,u7),
                           i8 <- range (l8,u8),
                           i9 <- range (l9,u9),
                           i10 <- range (l10,u10),
                           i11 <- range (l11,u11),
                           i12 <- range (l12,u12),
                           i13 <- range (l13,u13),
                           i14 <- range (l14,u14),
                           i15 <- range (l15,u15)]

    index ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15)
	  ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15))
          (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15) =
      index (l15,u15) i15 + rangeSize (l15,u15) * (
       index (l14,u14) i14 + rangeSize (l14,u14) * (
        index (l13,u13) i13 + rangeSize (l13,u13) * (
         index (l12,u12) i12 + rangeSize (l12,u12) * (
          index (l11,u11) i11 + rangeSize (l11,u11) * (
           index (l10,u10) i10 + rangeSize (l10,u10) * (
            index (l9,u9) i9 + rangeSize (l9,u9) * (
             index (l8,u8) i8 + rangeSize (l8,u8) * (
              index (l7,u7) i7 + rangeSize (l7,u7) * (
               index (l6,u6) i6 + rangeSize (l6,u6) * (
                index (l5,u5) i5 + rangeSize (l5,u5) * (
                 index (l4,u4) i4 + rangeSize (l4,u4) * (
                  index (l3,u3) i3 + rangeSize (l3,u3) * (
                   index (l2,u2) i2 + rangeSize (l2,u2) * (
                    index (l1,u1) i1))))))))))))))

    inRange ((l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15)
	    ,(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,u15))
            (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15) =
         inRange (l1,u1) i1
           && inRange (l2,u2) i2
           && inRange (l3,u3) i3
           && inRange (l4,u4) i4
           && inRange (l5,u5) i5
           && inRange (l6,u6) i6
           && inRange (l7,u7) i7
           && inRange (l8,u8) i8
           && inRange (l9,u9) i9
           && inRange (l10,u10) i10
           && inRange (l11,u11) i11
           && inRange (l12,u12) i12
           && inRange (l13,u13) i13
           && inRange (l14,u14) i14
           && inRange (l15,u15) i15