HsTools-0.0.1.1: Data/Ix/Tuple.hs
{-# LANGUAGE StandaloneDeriving, TypeSynonymInstances #-}
module Data.Ix.Tuple where
import Data.Ix
import GHC.Tuple
deriving instance (Ix a, Ix b, Ix c, Ix d, Ix e, Ix f) => Ix (a,b,c,d,e,f)
deriving instance (Ix a, Ix b, Ix c, Ix d, Ix e, Ix f, Ix g) => Ix (a,b,c,d,e,f,g)
deriving instance (Ix a, Ix b, Ix c, Ix d, Ix e, Ix f, Ix g, Ix h) => Ix (a,b,c,d,e,f,g,h)
-- how it would be done manually
{-
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)]
unsafeIndex ((l1,l2,l3,l4,l5,l6),(u1,u2,u3,u4,u5,u6)) (i1,i2,i3,i4,i5,i6) =
unsafeIndex (l6,u6) i6 + unsafeRangeSize (l6,u6) * (
unsafeIndex (l5,u5) i5 + unsafeRangeSize (l5,u5) * (
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,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
-}