{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleInstances #-}

module Database.MSSQLServer.Query.ResultSet ( ResultSet (..)
                                            , extractTableStreams
                                            , Row (..)
                                            ) where


import Database.Tds.Message
import Database.MSSQLServer.Query.Only




class ResultSet a where
  fromTokenStreams :: [TokenStream] -> a


instance ResultSet () where
  fromTokenStreams = f . extractTableStreams
    where
      f [] = ()
      f _ = error "fromTokenStreams: List length must be 0"

instance (Row a) => ResultSet [a] where
  fromTokenStreams = f . extractTableStreams
    where
      f [(m1,r1)] = b1
        where
          !b1 = fromListOfRawBytes m1 <$> r1
      f _ = error "fromTokenStreams: List length must be 1"

instance (Row a, Row b) => ResultSet ([a],[b]) where
  fromTokenStreams = f . extractTableStreams
    where
      f [(m1,r1),(m2,r2)] = (b1,b2)
        where
          !b1 = fromListOfRawBytes m1 <$> r1
          !b2 = fromListOfRawBytes m2 <$> r2
      f _ = error "fromTokenStreams: List length must be 2"

instance (Row a, Row b, Row c) => ResultSet ([a],[b],[c]) where
  fromTokenStreams = f . extractTableStreams
    where
      f [(m1,r1),(m2,r2),(m3,r3)] = (b1,b2,b3)
        where
          !b1 = fromListOfRawBytes m1 <$> r1
          !b2 = fromListOfRawBytes m2 <$> r2
          !b3 = fromListOfRawBytes m3 <$> r3
      f _ = error "fromTokenStreams: List length must be 3"

instance (Row a, Row b, Row c, Row d) => ResultSet ([a],[b],[c],[d]) where
  fromTokenStreams = f . extractTableStreams
    where
      f [(m1,r1),(m2,r2),(m3,r3),(m4,r4)] = (b1,b2,b3,b4)
        where
          !b1 = fromListOfRawBytes m1 <$> r1
          !b2 = fromListOfRawBytes m2 <$> r2
          !b3 = fromListOfRawBytes m3 <$> r3
          !b4 = fromListOfRawBytes m4 <$> r4
      f _ = error "fromTokenStreams: List length must be 4"

instance (Row a, Row b, Row c, Row d, Row e) => ResultSet ([a],[b],[c],[d],[e]) where
  fromTokenStreams = f . extractTableStreams
    where
      f [(m1,r1),(m2,r2),(m3,r3),(m4,r4),(m5,r5)] = (b1,b2,b3,b4,b5)
        where
          !b1 = fromListOfRawBytes m1 <$> r1
          !b2 = fromListOfRawBytes m2 <$> r2
          !b3 = fromListOfRawBytes m3 <$> r3
          !b4 = fromListOfRawBytes m4 <$> r4
          !b5 = fromListOfRawBytes m5 <$> r5
      f _ = error "fromTokenStreams: List length must be 5"




extractTableStreams :: [TokenStream] -> [([MetaColumnData],[[RawBytes]])]
extractTableStreams = map extract . span' . ( filter $ \x -> isTSColMetaData x || isTSRow x )
  where
    -- [(TSColMetaData,[TSRow])]
    span' :: [TokenStream] -> [(TokenStream,[TokenStream])]
    span' [] = []
    span' (cmd@TSColMetaData{}:xs) =
      let
        (rs,xs') = span isTSRow xs
      in (cmd,rs):span' xs'
    span' _ = error "extractTableStrams: TSColMetaData is necesarry"

    isTSColMetaData :: TokenStream -> Bool
    isTSColMetaData (TSColMetaData{}) = True
    isTSColMetaData _ = False

    isTSRow :: TokenStream -> Bool
    isTSRow (TSRow{}) = True
    isTSRow _ = False

    extract :: (TokenStream,[TokenStream]) -> ([MetaColumnData],[[RawBytes]])
    extract = \(tsCmd,tsRss) ->
      let (TSColMetaData (maybeCmd)) = tsCmd
          cds = case (\(ColMetaData x) -> x) <$> maybeCmd of
            Nothing -> error "extractTableStrams: ColMetaData is necessary"
            Just cds' -> cds'
          datas = (\(TSRow row) -> rawBytes <$> row) <$> tsRss
      in (cds, datas)
      where
        rawBytes :: RowColumnData -> RawBytes
        rawBytes (RCDOrdinal dt) = dt
        rawBytes (RCDLarge _ _ dt) = dt


mcdTypeInfo :: MetaColumnData -> TypeInfo
mcdTypeInfo (MetaColumnData _ _ ti _ _) = ti


class Row a where
  fromListOfRawBytes :: [MetaColumnData] -> [RawBytes] -> a

instance Row () where
  fromListOfRawBytes [] [] = ()
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 0"

instance (Data a) => Row (Only a) where
  fromListOfRawBytes [m1] [b1] = Only d1
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 1"

instance (Data a, Data b) => Row (a,b) where
  fromListOfRawBytes [m1,m2] [b1,b2] = (d1,d2)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 2"

instance (Data a, Data b, Data c) => Row (a,b,c) where
  fromListOfRawBytes [m1,m2,m3] [b1,b2,b3] = (d1,d2,d3)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 3"

instance (Data a, Data b, Data c, Data d) => Row (a,b,c,d) where
  fromListOfRawBytes [m1,m2,m3,m4] [b1,b2,b3,b4] = (d1,d2,d3,d4)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 4"

instance (Data a, Data b, Data c, Data d, Data e) => Row (a,b,c,d,e) where
  fromListOfRawBytes [m1,m2,m3,m4,m5] [b1,b2,b3,b4,b5] = (d1,d2,d3,d4,d5)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 5"

instance (Data a, Data b, Data c, Data d, Data e, Data f) => Row (a,b,c,d,e,f) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6] [b1,b2,b3,b4,b5,b6] = (d1,d2,d3,d4,d5,d6)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 6"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g) => Row (a,b,c,d,e,f,g) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7] [b1,b2,b3,b4,b5,b6,b7] = (d1,d2,d3,d4,d5,d6,d7)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 7"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h) => Row (a,b,c,d,e,f,g,h) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8] [b1,b2,b3,b4,b5,b6,b7,b8] = (d1,d2,d3,d4,d5,d6,d7,d8)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 8"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i) => Row (a,b,c,d,e,f,g,h,i) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9] [b1,b2,b3,b4,b5,b6,b7,b8,b9] = (d1,d2,d3,d4,d5,d6,d7,d8,d9)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 9"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j) => Row (a,b,c,d,e,f,g,h,i,j) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10] = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 10"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k) => Row (a,b,c,d,e,f,g,h,i,j,k) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 11"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l) => Row (a,b,c,d,e,f,g,h,i,j,k,l) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 12"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m) => Row (a,b,c,d,e,f,g,h,i,j,k,l,m) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 13"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n) => Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 14"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 15"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 16"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 17"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 18"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 19"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 20"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t, Data u) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
      !d21 = fromRawBytes (mcdTypeInfo m21) b21
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 21"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t, Data u, Data v) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
      !d21 = fromRawBytes (mcdTypeInfo m21) b21
      !d22 = fromRawBytes (mcdTypeInfo m22) b22
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 22"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t, Data u, Data v, Data w) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
      !d21 = fromRawBytes (mcdTypeInfo m21) b21
      !d22 = fromRawBytes (mcdTypeInfo m22) b22
      !d23 = fromRawBytes (mcdTypeInfo m23) b23
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 23"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t, Data u, Data v, Data w, Data x) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
      !d21 = fromRawBytes (mcdTypeInfo m21) b21
      !d22 = fromRawBytes (mcdTypeInfo m22) b22
      !d23 = fromRawBytes (mcdTypeInfo m23) b23
      !d24 = fromRawBytes (mcdTypeInfo m24) b24
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 24"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t, Data u, Data v, Data w, Data x, Data y) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
      !d21 = fromRawBytes (mcdTypeInfo m21) b21
      !d22 = fromRawBytes (mcdTypeInfo m22) b22
      !d23 = fromRawBytes (mcdTypeInfo m23) b23
      !d24 = fromRawBytes (mcdTypeInfo m24) b24
      !d25 = fromRawBytes (mcdTypeInfo m25) b25
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 25"

instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g, Data h, Data i, Data j, Data k, Data l, Data m, Data n, Data o, Data p, Data q, Data r, Data s
         , Data t, Data u, Data v, Data w, Data x, Data y, Data z) =>
         Row (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) where
  fromListOfRawBytes [m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15,m16,m17,m18,m19,m20,m21,m22,m23,m24,m25,m26] [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26]
    = (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26)
    where
      !d1 = fromRawBytes (mcdTypeInfo m1) b1
      !d2 = fromRawBytes (mcdTypeInfo m2) b2
      !d3 = fromRawBytes (mcdTypeInfo m3) b3
      !d4 = fromRawBytes (mcdTypeInfo m4) b4
      !d5 = fromRawBytes (mcdTypeInfo m5) b5
      !d6 = fromRawBytes (mcdTypeInfo m6) b6
      !d7 = fromRawBytes (mcdTypeInfo m7) b7
      !d8 = fromRawBytes (mcdTypeInfo m8) b8
      !d9 = fromRawBytes (mcdTypeInfo m9) b9
      !d10 = fromRawBytes (mcdTypeInfo m10) b10
      !d11 = fromRawBytes (mcdTypeInfo m11) b11
      !d12 = fromRawBytes (mcdTypeInfo m12) b12
      !d13 = fromRawBytes (mcdTypeInfo m13) b13
      !d14 = fromRawBytes (mcdTypeInfo m14) b14
      !d15 = fromRawBytes (mcdTypeInfo m15) b15
      !d16 = fromRawBytes (mcdTypeInfo m16) b16
      !d17 = fromRawBytes (mcdTypeInfo m17) b17
      !d18 = fromRawBytes (mcdTypeInfo m18) b18
      !d19 = fromRawBytes (mcdTypeInfo m19) b19
      !d20 = fromRawBytes (mcdTypeInfo m20) b20
      !d21 = fromRawBytes (mcdTypeInfo m21) b21
      !d22 = fromRawBytes (mcdTypeInfo m22) b22
      !d23 = fromRawBytes (mcdTypeInfo m23) b23
      !d24 = fromRawBytes (mcdTypeInfo m24) b24
      !d25 = fromRawBytes (mcdTypeInfo m25) b25
      !d26 = fromRawBytes (mcdTypeInfo m26) b26
  fromListOfRawBytes _ _ = error "fromListOfRawBytes: List length must be 26"