module Sound.MED.Raw.MMDDumpData where

import qualified Sound.MED.Raw.MMDDump as MMDDump
import Sound.MED.Raw.MMDDump(MMDDump)

import Sound.MED.Basic.Amiga
import Sound.MED.Basic.Utility

data MMDDumpData = MMDDumpData
  { MMDDumpData -> UWORD
numdumps :: UWORD
  , MMDDumpData -> [UWORD]
reserved :: [ UWORD ]
  , MMDDumpData -> [MMDDump]
dumps    :: [ MMDDump ]
  }
  deriving (Int -> MMDDumpData -> ShowS
[MMDDumpData] -> ShowS
MMDDumpData -> String
(Int -> MMDDumpData -> ShowS)
-> (MMDDumpData -> String)
-> ([MMDDumpData] -> ShowS)
-> Show MMDDumpData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMDDumpData] -> ShowS
$cshowList :: [MMDDumpData] -> ShowS
show :: MMDDumpData -> String
$cshow :: MMDDumpData -> String
showsPrec :: Int -> MMDDumpData -> ShowS
$cshowsPrec :: Int -> MMDDumpData -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMDDumpData #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMDDumpData #-}
peek :: (Reader m) => PTR -> m MMDDumpData
peek :: PTR -> m MMDDumpData
peek PTR
p = do
  UWORD
numdumps' <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD PTR
p
  [UWORD]
reserved' <- Peek m UWORD -> [PTR] -> m [UWORD]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD ([PTR] -> m [UWORD]) -> [PTR] -> m [UWORD]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
2) PTR
2 Int
3
  [PTR]
dumps''   <- (PTR -> m PTR) -> [PTR] -> m [PTR]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> m PTR
forall (m :: * -> *). Reader m => Peek m PTR
peekPTR ([PTR] -> m [PTR]) -> [PTR] -> m [PTR]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> UWORD -> [PTR]
forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGen (PTR
pPTR -> PTR -> PTR
forall a. Num a => a -> a -> a
+PTR
8) PTR
4 UWORD
numdumps'
  [MMDDump]
dumps'    <- (PTR -> m MMDDump) -> [PTR] -> m [MMDDump]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> m MMDDump
forall (m :: * -> *). Reader m => PTR -> m MMDDump
MMDDump.peek [PTR]
dumps''
  MMDDumpData -> m MMDDumpData
forall (m :: * -> *) a. Monad m => a -> m a
return (MMDDumpData -> m MMDDumpData) -> MMDDumpData -> m MMDDumpData
forall a b. (a -> b) -> a -> b
$ UWORD -> [UWORD] -> [MMDDump] -> MMDDumpData
MMDDumpData
    UWORD
numdumps' [UWORD]
reserved' [MMDDump]
dumps'