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