module Sound.MED.Raw.MMDDump where

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

data MMDDump = MMDDump
  { MMDDump -> ULONG
len     :: ULONG
  , MMDDump -> [UBYTE]
dat     :: [ UBYTE ]
  , MMDDump -> UWORD
ext_len :: UWORD
  , MMDDump -> Maybe [UBYTE]
name    :: Maybe [ UBYTE ]
  }
  deriving (Int -> MMDDump -> ShowS
[MMDDump] -> ShowS
MMDDump -> String
(Int -> MMDDump -> ShowS)
-> (MMDDump -> String) -> ([MMDDump] -> ShowS) -> Show MMDDump
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMDDump] -> ShowS
$cshowList :: [MMDDump] -> ShowS
show :: MMDDump -> String
$cshow :: MMDDump -> String
showsPrec :: Int -> MMDDump -> ShowS
$cshowsPrec :: Int -> MMDDump -> ShowS
Show)

{-# SPECIALISE peek :: PTR -> StorableReader MMDDump #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader MMDDump #-}
peek :: (Reader m) => PTR -> m MMDDump
peek :: ULONG -> m MMDDump
peek ULONG
p = do
  ULONG
len'     <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
0)
  ULONG
dat''    <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekPTR   (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
4)
  [UBYTE]
dat'     <- (ULONG -> m UBYTE) -> [ULONG] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([ULONG] -> m [UBYTE]) -> [ULONG] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> ULONG -> [ULONG]
forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGenCheck ULONG
dat'' ULONG
1 ULONG
len'
  UWORD
ext_len' <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
8)
  Maybe [UBYTE]
name'    <-
    Bool -> m [UBYTE] -> m (Maybe [UBYTE])
forall (m :: * -> *) a. Monad m => Bool -> m a -> m (Maybe a)
skipIf (UWORD
ext_len' UWORD -> UWORD -> Bool
forall a. Ord a => a -> a -> Bool
< UWORD
20) (m [UBYTE] -> m (Maybe [UBYTE])) -> m [UBYTE] -> m (Maybe [UBYTE])
forall a b. (a -> b) -> a -> b
$ (ULONG -> m UBYTE) -> [ULONG] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ULONG -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([ULONG] -> m [UBYTE]) -> [ULONG] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> Int -> [ULONG]
pointerRange (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
10) ULONG
1 Int
20
  MMDDump -> m MMDDump
forall (m :: * -> *) a. Monad m => a -> m a
return (MMDDump -> m MMDDump) -> MMDDump -> m MMDDump
forall a b. (a -> b) -> a -> b
$ ULONG -> [UBYTE] -> UWORD -> Maybe [UBYTE] -> MMDDump
MMDDump
    ULONG
len' [UBYTE]
dat' UWORD
ext_len' Maybe [UBYTE]
name'