packages feed

futhask-base-0.1.0.0: src/Futhask/Array/Tuple.hs

{-# LANGUAGE TypeFamilyDependencies, FlexibleContexts, GADTs, ApplicativeDo #-}
{-|
Tuple arrays
-}

module Futhask.Array.Tuple where
import Futhask.Array.Element
import Futhask.Array.Boxed
import System.IO.Unsafe

data T2Array a0 a1 where
  T2Array :: (Element a0, Element a1) => Array a0 -> Array a1 -> T2Array a0 a1
data MT2Array a0 a1 where
  MT2Array :: (Element a0, Element a1) => MArray a0 -> MArray a1 -> MT2Array a0 a1
instance (Element a0, Element a1) => Element (a0, a1) where
  type Array (a0, a1) = T2Array a0 a1
  type MArray (a0, a1) = MT2Array a0 a1
  size (T2Array a0 a1) = size a0
  msize (MT2Array a0 a1) = msize a0
  unsafeRead (T2Array a0 a1) idx = (unsafeRead a0 idx, unsafeRead a1 idx)
  unsafePeek (MT2Array a0 a1) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    pure (e0, e1)
  unsafePoke (MT2Array a0 a1) idx (e0, e1) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
  unsafeThaw (T2Array a0 a1) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    pure (MT2Array a0' a1')
  unsafeFreeze (MT2Array a0 a1) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    pure (T2Array a0' a1')
  unsafeSlice (T2Array a0 a1) i s = T2Array (unsafeSlice a0 i s) (unsafeSlice a1 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    pure (MT2Array a0 a1)

instance Element (T2Array a0 a1) where
  type Array (T2Array a0 a1) = BArray (T2Array a0 a1)
  type MArray (T2Array a0 a1) = MBArray (T2Array a0 a1)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Element a0, Element a1) => Show (T2Array a0 a1) where
  show = show . toList

zip2 :: (Element a0, Element a1) => Array a0 -> Array a1 -> Array (a0, a1)
zip2 a0 a1 = if size a0 == size a1
  then T2Array a0 a1
  else error "sizes of arguments do not match"
unzip2 :: (Element a0, Element a1) => Array (a0, a1) -> (Array a0, Array a1)
unzip2 (T2Array a0 a1) = (a0, a1)
data T3Array a0 a1 a2 where
  T3Array :: (Element a0, Element a1, Element a2) => Array a0 -> Array a1 -> Array a2 -> T3Array a0 a1 a2
data MT3Array a0 a1 a2 where
  MT3Array :: (Element a0, Element a1, Element a2) => MArray a0 -> MArray a1 -> MArray a2 -> MT3Array a0 a1 a2
instance (Element a0, Element a1, Element a2) => Element (a0, a1, a2) where
  type Array (a0, a1, a2) = T3Array a0 a1 a2
  type MArray (a0, a1, a2) = MT3Array a0 a1 a2
  size (T3Array a0 a1 a2) = size a0
  msize (MT3Array a0 a1 a2) = msize a0
  unsafeRead (T3Array a0 a1 a2) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx)
  unsafePeek (MT3Array a0 a1 a2) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    pure (e0, e1, e2)
  unsafePoke (MT3Array a0 a1 a2) idx (e0, e1, e2) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
  unsafeThaw (T3Array a0 a1 a2) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    pure (MT3Array a0' a1' a2')
  unsafeFreeze (MT3Array a0 a1 a2) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    pure (T3Array a0' a1' a2')
  unsafeSlice (T3Array a0 a1 a2) i s = T3Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    pure (MT3Array a0 a1 a2)

instance Element (T3Array a0 a1 a2) where
  type Array (T3Array a0 a1 a2) = BArray (T3Array a0 a1 a2)
  type MArray (T3Array a0 a1 a2) = MBArray (T3Array a0 a1 a2)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Element a0, Element a1, Element a2) => Show (T3Array a0 a1 a2) where
  show = show . toList

zip3 :: (Element a0, Element a1, Element a2) => Array a0 -> Array a1 -> Array a2 -> Array (a0, a1, a2)
zip3 a0 a1 a2 = if size a0 == size a1 && size a1 == size a2
  then T3Array a0 a1 a2
  else error "sizes of arguments do not match"
unzip3 :: (Element a0, Element a1, Element a2) => Array (a0, a1, a2) -> (Array a0, Array a1, Array a2)
unzip3 (T3Array a0 a1 a2) = (a0, a1, a2)
data T4Array a0 a1 a2 a3 where
  T4Array :: (Element a0, Element a1, Element a2, Element a3) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> T4Array a0 a1 a2 a3
data MT4Array a0 a1 a2 a3 where
  MT4Array :: (Element a0, Element a1, Element a2, Element a3) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MT4Array a0 a1 a2 a3
instance (Element a0, Element a1, Element a2, Element a3) => Element (a0, a1, a2, a3) where
  type Array (a0, a1, a2, a3) = T4Array a0 a1 a2 a3
  type MArray (a0, a1, a2, a3) = MT4Array a0 a1 a2 a3
  size (T4Array a0 a1 a2 a3) = size a0
  msize (MT4Array a0 a1 a2 a3) = msize a0
  unsafeRead (T4Array a0 a1 a2 a3) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx)
  unsafePeek (MT4Array a0 a1 a2 a3) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    pure (e0, e1, e2, e3)
  unsafePoke (MT4Array a0 a1 a2 a3) idx (e0, e1, e2, e3) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
  unsafeThaw (T4Array a0 a1 a2 a3) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    pure (MT4Array a0' a1' a2' a3')
  unsafeFreeze (MT4Array a0 a1 a2 a3) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    pure (T4Array a0' a1' a2' a3')
  unsafeSlice (T4Array a0 a1 a2 a3) i s = T4Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    pure (MT4Array a0 a1 a2 a3)

instance Element (T4Array a0 a1 a2 a3) where
  type Array (T4Array a0 a1 a2 a3) = BArray (T4Array a0 a1 a2 a3)
  type MArray (T4Array a0 a1 a2 a3) = MBArray (T4Array a0 a1 a2 a3)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Element a0, Element a1, Element a2, Element a3) => Show (T4Array a0 a1 a2 a3) where
  show = show . toList

zip4 :: (Element a0, Element a1, Element a2, Element a3) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array (a0, a1, a2, a3)
zip4 a0 a1 a2 a3 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3
  then T4Array a0 a1 a2 a3
  else error "sizes of arguments do not match"
unzip4 :: (Element a0, Element a1, Element a2, Element a3) => Array (a0, a1, a2, a3) -> (Array a0, Array a1, Array a2, Array a3)
unzip4 (T4Array a0 a1 a2 a3) = (a0, a1, a2, a3)
data T5Array a0 a1 a2 a3 a4 where
  T5Array :: (Element a0, Element a1, Element a2, Element a3, Element a4) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> T5Array a0 a1 a2 a3 a4
data MT5Array a0 a1 a2 a3 a4 where
  MT5Array :: (Element a0, Element a1, Element a2, Element a3, Element a4) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MT5Array a0 a1 a2 a3 a4
instance (Element a0, Element a1, Element a2, Element a3, Element a4) => Element (a0, a1, a2, a3, a4) where
  type Array (a0, a1, a2, a3, a4) = T5Array a0 a1 a2 a3 a4
  type MArray (a0, a1, a2, a3, a4) = MT5Array a0 a1 a2 a3 a4
  size (T5Array a0 a1 a2 a3 a4) = size a0
  msize (MT5Array a0 a1 a2 a3 a4) = msize a0
  unsafeRead (T5Array a0 a1 a2 a3 a4) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx)
  unsafePeek (MT5Array a0 a1 a2 a3 a4) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    pure (e0, e1, e2, e3, e4)
  unsafePoke (MT5Array a0 a1 a2 a3 a4) idx (e0, e1, e2, e3, e4) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
  unsafeThaw (T5Array a0 a1 a2 a3 a4) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    pure (MT5Array a0' a1' a2' a3' a4')
  unsafeFreeze (MT5Array a0 a1 a2 a3 a4) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    pure (T5Array a0' a1' a2' a3' a4')
  unsafeSlice (T5Array a0 a1 a2 a3 a4) i s = T5Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    pure (MT5Array a0 a1 a2 a3 a4)

instance Element (T5Array a0 a1 a2 a3 a4) where
  type Array (T5Array a0 a1 a2 a3 a4) = BArray (T5Array a0 a1 a2 a3 a4)
  type MArray (T5Array a0 a1 a2 a3 a4) = MBArray (T5Array a0 a1 a2 a3 a4)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Element a0, Element a1, Element a2, Element a3, Element a4) => Show (T5Array a0 a1 a2 a3 a4) where
  show = show . toList

zip5 :: (Element a0, Element a1, Element a2, Element a3, Element a4) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array (a0, a1, a2, a3, a4)
zip5 a0 a1 a2 a3 a4 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4
  then T5Array a0 a1 a2 a3 a4
  else error "sizes of arguments do not match"
unzip5 :: (Element a0, Element a1, Element a2, Element a3, Element a4) => Array (a0, a1, a2, a3, a4) -> (Array a0, Array a1, Array a2, Array a3, Array a4)
unzip5 (T5Array a0 a1 a2 a3 a4) = (a0, a1, a2, a3, a4)
data T6Array a0 a1 a2 a3 a4 a5 where
  T6Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> T6Array a0 a1 a2 a3 a4 a5
data MT6Array a0 a1 a2 a3 a4 a5 where
  MT6Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MT6Array a0 a1 a2 a3 a4 a5
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5) => Element (a0, a1, a2, a3, a4, a5) where
  type Array (a0, a1, a2, a3, a4, a5) = T6Array a0 a1 a2 a3 a4 a5
  type MArray (a0, a1, a2, a3, a4, a5) = MT6Array a0 a1 a2 a3 a4 a5
  size (T6Array a0 a1 a2 a3 a4 a5) = size a0
  msize (MT6Array a0 a1 a2 a3 a4 a5) = msize a0
  unsafeRead (T6Array a0 a1 a2 a3 a4 a5) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx)
  unsafePeek (MT6Array a0 a1 a2 a3 a4 a5) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    pure (e0, e1, e2, e3, e4, e5)
  unsafePoke (MT6Array a0 a1 a2 a3 a4 a5) idx (e0, e1, e2, e3, e4, e5) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
  unsafeThaw (T6Array a0 a1 a2 a3 a4 a5) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    pure (MT6Array a0' a1' a2' a3' a4' a5')
  unsafeFreeze (MT6Array a0 a1 a2 a3 a4 a5) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    pure (T6Array a0' a1' a2' a3' a4' a5')
  unsafeSlice (T6Array a0 a1 a2 a3 a4 a5) i s = T6Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    pure (MT6Array a0 a1 a2 a3 a4 a5)

instance Element (T6Array a0 a1 a2 a3 a4 a5) where
  type Array (T6Array a0 a1 a2 a3 a4 a5) = BArray (T6Array a0 a1 a2 a3 a4 a5)
  type MArray (T6Array a0 a1 a2 a3 a4 a5) = MBArray (T6Array a0 a1 a2 a3 a4 a5)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5) => Show (T6Array a0 a1 a2 a3 a4 a5) where
  show = show . toList

zip6 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array (a0, a1, a2, a3, a4, a5)
zip6 a0 a1 a2 a3 a4 a5 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5
  then T6Array a0 a1 a2 a3 a4 a5
  else error "sizes of arguments do not match"
unzip6 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5) => Array (a0, a1, a2, a3, a4, a5) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5)
unzip6 (T6Array a0 a1 a2 a3 a4 a5) = (a0, a1, a2, a3, a4, a5)
data T7Array a0 a1 a2 a3 a4 a5 a6 where
  T7Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> T7Array a0 a1 a2 a3 a4 a5 a6
data MT7Array a0 a1 a2 a3 a4 a5 a6 where
  MT7Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MT7Array a0 a1 a2 a3 a4 a5 a6
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6) => Element (a0, a1, a2, a3, a4, a5, a6) where
  type Array (a0, a1, a2, a3, a4, a5, a6) = T7Array a0 a1 a2 a3 a4 a5 a6
  type MArray (a0, a1, a2, a3, a4, a5, a6) = MT7Array a0 a1 a2 a3 a4 a5 a6
  size (T7Array a0 a1 a2 a3 a4 a5 a6) = size a0
  msize (MT7Array a0 a1 a2 a3 a4 a5 a6) = msize a0
  unsafeRead (T7Array a0 a1 a2 a3 a4 a5 a6) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx)
  unsafePeek (MT7Array a0 a1 a2 a3 a4 a5 a6) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    pure (e0, e1, e2, e3, e4, e5, e6)
  unsafePoke (MT7Array a0 a1 a2 a3 a4 a5 a6) idx (e0, e1, e2, e3, e4, e5, e6) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
  unsafeThaw (T7Array a0 a1 a2 a3 a4 a5 a6) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    pure (MT7Array a0' a1' a2' a3' a4' a5' a6')
  unsafeFreeze (MT7Array a0 a1 a2 a3 a4 a5 a6) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    pure (T7Array a0' a1' a2' a3' a4' a5' a6')
  unsafeSlice (T7Array a0 a1 a2 a3 a4 a5 a6) i s = T7Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    pure (MT7Array a0 a1 a2 a3 a4 a5 a6)

instance Element (T7Array a0 a1 a2 a3 a4 a5 a6) where
  type Array (T7Array a0 a1 a2 a3 a4 a5 a6) = BArray (T7Array a0 a1 a2 a3 a4 a5 a6)
  type MArray (T7Array a0 a1 a2 a3 a4 a5 a6) = MBArray (T7Array a0 a1 a2 a3 a4 a5 a6)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6) => Show (T7Array a0 a1 a2 a3 a4 a5 a6) where
  show = show . toList

zip7 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array (a0, a1, a2, a3, a4, a5, a6)
zip7 a0 a1 a2 a3 a4 a5 a6 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6
  then T7Array a0 a1 a2 a3 a4 a5 a6
  else error "sizes of arguments do not match"
unzip7 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6) => Array (a0, a1, a2, a3, a4, a5, a6) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6)
unzip7 (T7Array a0 a1 a2 a3 a4 a5 a6) = (a0, a1, a2, a3, a4, a5, a6)
data T8Array a0 a1 a2 a3 a4 a5 a6 a7 where
  T8Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> T8Array a0 a1 a2 a3 a4 a5 a6 a7
data MT8Array a0 a1 a2 a3 a4 a5 a6 a7 where
  MT8Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MT8Array a0 a1 a2 a3 a4 a5 a6 a7
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7) => Element (a0, a1, a2, a3, a4, a5, a6, a7) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7) = T8Array a0 a1 a2 a3 a4 a5 a6 a7
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7) = MT8Array a0 a1 a2 a3 a4 a5 a6 a7
  size (T8Array a0 a1 a2 a3 a4 a5 a6 a7) = size a0
  msize (MT8Array a0 a1 a2 a3 a4 a5 a6 a7) = msize a0
  unsafeRead (T8Array a0 a1 a2 a3 a4 a5 a6 a7) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx)
  unsafePeek (MT8Array a0 a1 a2 a3 a4 a5 a6 a7) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7)
  unsafePoke (MT8Array a0 a1 a2 a3 a4 a5 a6 a7) idx (e0, e1, e2, e3, e4, e5, e6, e7) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
  unsafeThaw (T8Array a0 a1 a2 a3 a4 a5 a6 a7) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    pure (MT8Array a0' a1' a2' a3' a4' a5' a6' a7')
  unsafeFreeze (MT8Array a0 a1 a2 a3 a4 a5 a6 a7) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    pure (T8Array a0' a1' a2' a3' a4' a5' a6' a7')
  unsafeSlice (T8Array a0 a1 a2 a3 a4 a5 a6 a7) i s = T8Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    pure (MT8Array a0 a1 a2 a3 a4 a5 a6 a7)

instance Element (T8Array a0 a1 a2 a3 a4 a5 a6 a7) where
  type Array (T8Array a0 a1 a2 a3 a4 a5 a6 a7) = BArray (T8Array a0 a1 a2 a3 a4 a5 a6 a7)
  type MArray (T8Array a0 a1 a2 a3 a4 a5 a6 a7) = MBArray (T8Array a0 a1 a2 a3 a4 a5 a6 a7)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7) => Show (T8Array a0 a1 a2 a3 a4 a5 a6 a7) where
  show = show . toList

zip8 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array (a0, a1, a2, a3, a4, a5, a6, a7)
zip8 a0 a1 a2 a3 a4 a5 a6 a7 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7
  then T8Array a0 a1 a2 a3 a4 a5 a6 a7
  else error "sizes of arguments do not match"
unzip8 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7) => Array (a0, a1, a2, a3, a4, a5, a6, a7) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7)
unzip8 (T8Array a0 a1 a2 a3 a4 a5 a6 a7) = (a0, a1, a2, a3, a4, a5, a6, a7)
data T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8 where
  T9Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8
data MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8 where
  MT9Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8) = T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8) = MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8
  size (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = size a0
  msize (MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = msize a0
  unsafeRead (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx)
  unsafePeek (MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8)
  unsafePoke (MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
  unsafeThaw (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    pure (MT9Array a0' a1' a2' a3' a4' a5' a6' a7' a8')
  unsafeFreeze (MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    pure (T9Array a0' a1' a2' a3' a4' a5' a6' a7' a8')
  unsafeSlice (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) i s = T9Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    pure (MT9Array a0 a1 a2 a3 a4 a5 a6 a7 a8)

instance Element (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) where
  type Array (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = BArray (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8)
  type MArray (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = MBArray (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8) => Show (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) where
  show = show . toList

zip9 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8)
zip9 a0 a1 a2 a3 a4 a5 a6 a7 a8 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8
  then T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8
  else error "sizes of arguments do not match"
unzip9 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8)
unzip9 (T9Array a0 a1 a2 a3 a4 a5 a6 a7 a8) = (a0, a1, a2, a3, a4, a5, a6, a7, a8)
data T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 where
  T10Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
data MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 where
  MT10Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) = T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) = MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
  size (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = size a0
  msize (MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = msize a0
  unsafeRead (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx)
  unsafePeek (MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)
  unsafePoke (MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
  unsafeThaw (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    pure (MT10Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9')
  unsafeFreeze (MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    pure (T10Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9')
  unsafeSlice (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) i s = T10Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    pure (MT10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9)

instance Element (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) where
  type Array (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = BArray (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9)
  type MArray (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = MBArray (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Show a9, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9) => Show (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) where
  show = show . toList

zip10 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
zip10 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9
  then T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9
  else error "sizes of arguments do not match"
unzip10 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9)
unzip10 (T10Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)
data T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 where
  T11Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
data MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 where
  MT11Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MArray a10 -> MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) = T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) = MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
  size (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = size a0
  msize (MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = msize a0
  unsafeRead (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx, unsafeRead a10 idx)
  unsafePeek (MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    e10 <- unsafePeek a10 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10)
  unsafePoke (MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
    unsafePoke a10 idx e10
  unsafeThaw (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    a10' <- unsafeThaw a10
    pure (MT11Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10')
  unsafeFreeze (MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    a10' <- unsafeFreeze a10
    pure (T11Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10')
  unsafeSlice (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) i s = T11Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s) (unsafeSlice a10 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    a10 <- scratch s
    pure (MT11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10)

instance Element (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) where
  type Array (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = BArray (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10)
  type MArray (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = MBArray (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Show a9, Show a10, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10) => Show (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) where
  show = show . toList

zip11 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
zip11 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9 && size a9 == size a10
  then T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
  else error "sizes of arguments do not match"
unzip11 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9, Array a10)
unzip11 (T11Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
data T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 where
  T12Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11
data MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 where
  MT12Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MArray a10 -> MArray a11 -> MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) = T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) = MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11
  size (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = size a0
  msize (MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = msize a0
  unsafeRead (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx, unsafeRead a10 idx, unsafeRead a11 idx)
  unsafePeek (MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    e10 <- unsafePeek a10 idx
    e11 <- unsafePeek a11 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11)
  unsafePoke (MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
    unsafePoke a10 idx e10
    unsafePoke a11 idx e11
  unsafeThaw (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    a10' <- unsafeThaw a10
    a11' <- unsafeThaw a11
    pure (MT12Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11')
  unsafeFreeze (MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    a10' <- unsafeFreeze a10
    a11' <- unsafeFreeze a11
    pure (T12Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11')
  unsafeSlice (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) i s = T12Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s) (unsafeSlice a10 i s) (unsafeSlice a11 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    a10 <- scratch s
    a11 <- scratch s
    pure (MT12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11)

instance Element (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) where
  type Array (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = BArray (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11)
  type MArray (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = MBArray (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Show a9, Show a10, Show a11, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11) => Show (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) where
  show = show . toList

zip12 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
zip12 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9 && size a9 == size a10 && size a10 == size a11
  then T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11
  else error "sizes of arguments do not match"
unzip12 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9, Array a10, Array a11)
unzip12 (T12Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
data T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 where
  T13Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12
data MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 where
  MT13Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MArray a10 -> MArray a11 -> MArray a12 -> MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) = T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) = MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12
  size (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = size a0
  msize (MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = msize a0
  unsafeRead (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx, unsafeRead a10 idx, unsafeRead a11 idx, unsafeRead a12 idx)
  unsafePeek (MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    e10 <- unsafePeek a10 idx
    e11 <- unsafePeek a11 idx
    e12 <- unsafePeek a12 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12)
  unsafePoke (MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
    unsafePoke a10 idx e10
    unsafePoke a11 idx e11
    unsafePoke a12 idx e12
  unsafeThaw (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    a10' <- unsafeThaw a10
    a11' <- unsafeThaw a11
    a12' <- unsafeThaw a12
    pure (MT13Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12')
  unsafeFreeze (MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    a10' <- unsafeFreeze a10
    a11' <- unsafeFreeze a11
    a12' <- unsafeFreeze a12
    pure (T13Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12')
  unsafeSlice (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) i s = T13Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s) (unsafeSlice a10 i s) (unsafeSlice a11 i s) (unsafeSlice a12 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    a10 <- scratch s
    a11 <- scratch s
    a12 <- scratch s
    pure (MT13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12)

instance Element (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) where
  type Array (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = BArray (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12)
  type MArray (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = MBArray (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Show a9, Show a10, Show a11, Show a12, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12) => Show (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) where
  show = show . toList

zip13 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
zip13 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9 && size a9 == size a10 && size a10 == size a11 && size a11 == size a12
  then T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12
  else error "sizes of arguments do not match"
unzip13 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9, Array a10, Array a11, Array a12)
unzip13 (T13Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
data T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 where
  T14Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array a13 -> T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
data MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 where
  MT14Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MArray a10 -> MArray a11 -> MArray a12 -> MArray a13 -> MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) = T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) = MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
  size (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = size a0
  msize (MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = msize a0
  unsafeRead (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx, unsafeRead a10 idx, unsafeRead a11 idx, unsafeRead a12 idx, unsafeRead a13 idx)
  unsafePeek (MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    e10 <- unsafePeek a10 idx
    e11 <- unsafePeek a11 idx
    e12 <- unsafePeek a12 idx
    e13 <- unsafePeek a13 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13)
  unsafePoke (MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
    unsafePoke a10 idx e10
    unsafePoke a11 idx e11
    unsafePoke a12 idx e12
    unsafePoke a13 idx e13
  unsafeThaw (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    a10' <- unsafeThaw a10
    a11' <- unsafeThaw a11
    a12' <- unsafeThaw a12
    a13' <- unsafeThaw a13
    pure (MT14Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12' a13')
  unsafeFreeze (MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    a10' <- unsafeFreeze a10
    a11' <- unsafeFreeze a11
    a12' <- unsafeFreeze a12
    a13' <- unsafeFreeze a13
    pure (T14Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12' a13')
  unsafeSlice (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) i s = T14Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s) (unsafeSlice a10 i s) (unsafeSlice a11 i s) (unsafeSlice a12 i s) (unsafeSlice a13 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    a10 <- scratch s
    a11 <- scratch s
    a12 <- scratch s
    a13 <- scratch s
    pure (MT14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13)

instance Element (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) where
  type Array (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = BArray (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13)
  type MArray (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = MBArray (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Show a9, Show a10, Show a11, Show a12, Show a13, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13) => Show (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) where
  show = show . toList

zip14 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array a13 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
zip14 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9 && size a9 == size a10 && size a10 == size a11 && size a11 == size a12 && size a12 == size a13
  then T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13
  else error "sizes of arguments do not match"
unzip14 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9, Array a10, Array a11, Array a12, Array a13)
unzip14 (T14Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
data T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 where
  T15Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array a13 -> Array a14 -> T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14
data MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 where
  MT15Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MArray a10 -> MArray a11 -> MArray a12 -> MArray a13 -> MArray a14 -> MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) = T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) = MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14
  size (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = size a0
  msize (MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = msize a0
  unsafeRead (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx, unsafeRead a10 idx, unsafeRead a11 idx, unsafeRead a12 idx, unsafeRead a13 idx, unsafeRead a14 idx)
  unsafePeek (MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    e10 <- unsafePeek a10 idx
    e11 <- unsafePeek a11 idx
    e12 <- unsafePeek a12 idx
    e13 <- unsafePeek a13 idx
    e14 <- unsafePeek a14 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14)
  unsafePoke (MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
    unsafePoke a10 idx e10
    unsafePoke a11 idx e11
    unsafePoke a12 idx e12
    unsafePoke a13 idx e13
    unsafePoke a14 idx e14
  unsafeThaw (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    a10' <- unsafeThaw a10
    a11' <- unsafeThaw a11
    a12' <- unsafeThaw a12
    a13' <- unsafeThaw a13
    a14' <- unsafeThaw a14
    pure (MT15Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12' a13' a14')
  unsafeFreeze (MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    a10' <- unsafeFreeze a10
    a11' <- unsafeFreeze a11
    a12' <- unsafeFreeze a12
    a13' <- unsafeFreeze a13
    a14' <- unsafeFreeze a14
    pure (T15Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12' a13' a14')
  unsafeSlice (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) i s = T15Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s) (unsafeSlice a10 i s) (unsafeSlice a11 i s) (unsafeSlice a12 i s) (unsafeSlice a13 i s) (unsafeSlice a14 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    a10 <- scratch s
    a11 <- scratch s
    a12 <- scratch s
    a13 <- scratch s
    a14 <- scratch s
    pure (MT15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14)

instance Element (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) where
  type Array (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = BArray (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14)
  type MArray (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = MBArray (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB

instance (Show a0, Show a1, Show a2, Show a3, Show a4, Show a5, Show a6, Show a7, Show a8, Show a9, Show a10, Show a11, Show a12, Show a13, Show a14, Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14) => Show (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) where
  show = show . toList

zip15 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array a13 -> Array a14 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
zip15 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9 && size a9 == size a10 && size a10 == size a11 && size a11 == size a12 && size a12 == size a13 && size a13 == size a14
  then T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14
  else error "sizes of arguments do not match"
unzip15 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9, Array a10, Array a11, Array a12, Array a13, Array a14)
unzip15 (T15Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
data T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 where
  T16Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14, Element a15) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array a13 -> Array a14 -> Array a15 -> T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
data MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 where
  MT16Array :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14, Element a15) => MArray a0 -> MArray a1 -> MArray a2 -> MArray a3 -> MArray a4 -> MArray a5 -> MArray a6 -> MArray a7 -> MArray a8 -> MArray a9 -> MArray a10 -> MArray a11 -> MArray a12 -> MArray a13 -> MArray a14 -> MArray a15 -> MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
instance (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14, Element a15) => Element (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) where
  type Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) = T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
  type MArray (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) = MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
  size (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = size a0
  msize (MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = msize a0
  unsafeRead (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) idx = (unsafeRead a0 idx, unsafeRead a1 idx, unsafeRead a2 idx, unsafeRead a3 idx, unsafeRead a4 idx, unsafeRead a5 idx, unsafeRead a6 idx, unsafeRead a7 idx, unsafeRead a8 idx, unsafeRead a9 idx, unsafeRead a10 idx, unsafeRead a11 idx, unsafeRead a12 idx, unsafeRead a13 idx, unsafeRead a14 idx, unsafeRead a15 idx)
  unsafePeek (MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) idx = do
    e0 <- unsafePeek a0 idx
    e1 <- unsafePeek a1 idx
    e2 <- unsafePeek a2 idx
    e3 <- unsafePeek a3 idx
    e4 <- unsafePeek a4 idx
    e5 <- unsafePeek a5 idx
    e6 <- unsafePeek a6 idx
    e7 <- unsafePeek a7 idx
    e8 <- unsafePeek a8 idx
    e9 <- unsafePeek a9 idx
    e10 <- unsafePeek a10 idx
    e11 <- unsafePeek a11 idx
    e12 <- unsafePeek a12 idx
    e13 <- unsafePeek a13 idx
    e14 <- unsafePeek a14 idx
    e15 <- unsafePeek a15 idx
    pure (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15)
  unsafePoke (MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) idx (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) = do
    unsafePoke a0 idx e0
    unsafePoke a1 idx e1
    unsafePoke a2 idx e2
    unsafePoke a3 idx e3
    unsafePoke a4 idx e4
    unsafePoke a5 idx e5
    unsafePoke a6 idx e6
    unsafePoke a7 idx e7
    unsafePoke a8 idx e8
    unsafePoke a9 idx e9
    unsafePoke a10 idx e10
    unsafePoke a11 idx e11
    unsafePoke a12 idx e12
    unsafePoke a13 idx e13
    unsafePoke a14 idx e14
    unsafePoke a15 idx e15
  unsafeThaw (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = do
    a0' <- unsafeThaw a0
    a1' <- unsafeThaw a1
    a2' <- unsafeThaw a2
    a3' <- unsafeThaw a3
    a4' <- unsafeThaw a4
    a5' <- unsafeThaw a5
    a6' <- unsafeThaw a6
    a7' <- unsafeThaw a7
    a8' <- unsafeThaw a8
    a9' <- unsafeThaw a9
    a10' <- unsafeThaw a10
    a11' <- unsafeThaw a11
    a12' <- unsafeThaw a12
    a13' <- unsafeThaw a13
    a14' <- unsafeThaw a14
    a15' <- unsafeThaw a15
    pure (MT16Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12' a13' a14' a15')
  unsafeFreeze (MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = do
    a0' <- unsafeFreeze a0
    a1' <- unsafeFreeze a1
    a2' <- unsafeFreeze a2
    a3' <- unsafeFreeze a3
    a4' <- unsafeFreeze a4
    a5' <- unsafeFreeze a5
    a6' <- unsafeFreeze a6
    a7' <- unsafeFreeze a7
    a8' <- unsafeFreeze a8
    a9' <- unsafeFreeze a9
    a10' <- unsafeFreeze a10
    a11' <- unsafeFreeze a11
    a12' <- unsafeFreeze a12
    a13' <- unsafeFreeze a13
    a14' <- unsafeFreeze a14
    a15' <- unsafeFreeze a15
    pure (T16Array a0' a1' a2' a3' a4' a5' a6' a7' a8' a9' a10' a11' a12' a13' a14' a15')
  unsafeSlice (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) i s = T16Array (unsafeSlice a0 i s) (unsafeSlice a1 i s) (unsafeSlice a2 i s) (unsafeSlice a3 i s) (unsafeSlice a4 i s) (unsafeSlice a5 i s) (unsafeSlice a6 i s) (unsafeSlice a7 i s) (unsafeSlice a8 i s) (unsafeSlice a9 i s) (unsafeSlice a10 i s) (unsafeSlice a11 i s) (unsafeSlice a12 i s) (unsafeSlice a13 i s) (unsafeSlice a14 i s) (unsafeSlice a15 i s)
  scratch s = do
    a0 <- scratch s
    a1 <- scratch s
    a2 <- scratch s
    a3 <- scratch s
    a4 <- scratch s
    a5 <- scratch s
    a6 <- scratch s
    a7 <- scratch s
    a8 <- scratch s
    a9 <- scratch s
    a10 <- scratch s
    a11 <- scratch s
    a12 <- scratch s
    a13 <- scratch s
    a14 <- scratch s
    a15 <- scratch s
    pure (MT16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15)

instance Element (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) where
  type Array (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = BArray (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15)
  type MArray (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = MBArray (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15)
  size = sizeB
  msize = msizeB
  unsafeRead = unsafeReadB
  unsafePeek = unsafePeekB
  unsafePoke = unsafePokeB
  unsafeThaw = unsafeThawB
  unsafeFreeze = unsafeFreezeB
  unsafeSlice = unsafeSliceB
  scratch = scratchB


zip16 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14, Element a15) => Array a0 -> Array a1 -> Array a2 -> Array a3 -> Array a4 -> Array a5 -> Array a6 -> Array a7 -> Array a8 -> Array a9 -> Array a10 -> Array a11 -> Array a12 -> Array a13 -> Array a14 -> Array a15 -> Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
zip16 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 = if size a0 == size a1 && size a1 == size a2 && size a2 == size a3 && size a3 == size a4 && size a4 == size a5 && size a5 == size a6 && size a6 == size a7 && size a7 == size a8 && size a8 == size a9 && size a9 == size a10 && size a10 == size a11 && size a11 == size a12 && size a12 == size a13 && size a13 == size a14 && size a14 == size a15
  then T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
  else error "sizes of arguments do not match"
unzip16 :: (Element a0, Element a1, Element a2, Element a3, Element a4, Element a5, Element a6, Element a7, Element a8, Element a9, Element a10, Element a11, Element a12, Element a13, Element a14, Element a15) => Array (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) -> (Array a0, Array a1, Array a2, Array a3, Array a4, Array a5, Array a6, Array a7, Array a8, Array a9, Array a10, Array a11, Array a12, Array a13, Array a14, Array a15)
unzip16 (T16Array a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15) = (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)