module Sound.MED.Raw.PlaySeq where

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

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

{-# SPECIALISE peek :: PTR -> StorableReader PlaySeq #-}
{-# SPECIALISE peek :: PTR -> ByteStringReader PlaySeq #-}
peek :: (Reader m) => PTR -> m PlaySeq
peek :: ULONG -> m PlaySeq
peek ULONG
p = do
  [UBYTE]
name'      <- (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
p ULONG
1 Int
32
  ULONG
reserved0' <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
32)
  ULONG
reserved1' <- Peek m ULONG
forall (m :: * -> *). Reader m => Peek m ULONG
peekULONG (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
36)
  UWORD
len'       <- Peek m UWORD
forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
40)
  [UWORD]
seq'       <- Peek m UWORD -> [ULONG] -> 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 ([ULONG] -> m [UWORD]) -> [ULONG] -> m [UWORD]
forall a b. (a -> b) -> a -> b
$ ULONG -> ULONG -> UWORD -> [ULONG]
forall i. Integral i => ULONG -> ULONG -> i -> [ULONG]
pointerRangeGen (ULONG
pULONG -> ULONG -> ULONG
forall a. Num a => a -> a -> a
+ULONG
42) ULONG
2 UWORD
len'
  PlaySeq -> m PlaySeq
forall (m :: * -> *) a. Monad m => a -> m a
return (PlaySeq -> m PlaySeq) -> PlaySeq -> m PlaySeq
forall a b. (a -> b) -> a -> b
$ [UBYTE] -> ULONG -> ULONG -> UWORD -> [UWORD] -> PlaySeq
PlaySeq
    [UBYTE]
name' ULONG
reserved0' ULONG
reserved1' UWORD
len' [UWORD]
seq'