module Sound.MED.Raw.MMDInstrInfo where

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

data MMDInstrInfo = MMDInstrInfo
  { MMDInstrInfo -> Maybe [UBYTE]
name :: Maybe [ UBYTE ]
  }
  deriving (Int -> MMDInstrInfo -> ShowS
[MMDInstrInfo] -> ShowS
MMDInstrInfo -> String
(Int -> MMDInstrInfo -> ShowS)
-> (MMDInstrInfo -> String)
-> ([MMDInstrInfo] -> ShowS)
-> Show MMDInstrInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MMDInstrInfo] -> ShowS
$cshowList :: [MMDInstrInfo] -> ShowS
show :: MMDInstrInfo -> String
$cshow :: MMDInstrInfo -> String
showsPrec :: Int -> MMDInstrInfo -> ShowS
$cshowsPrec :: Int -> MMDInstrInfo -> ShowS
Show)

{-# SPECIALISE peek :: UWORD -> PTR -> StorableReader MMDInstrInfo #-}
{-# SPECIALISE peek :: UWORD -> PTR -> ByteStringReader MMDInstrInfo #-}
peek :: (Reader m) => UWORD -> PTR -> m MMDInstrInfo
peek :: UWORD -> PTR -> m MMDInstrInfo
peek UWORD
size PTR
p = do
  Maybe [UBYTE]
name' <- Bool -> m [UBYTE] -> m (Maybe [UBYTE])
forall (m :: * -> *) a. Monad m => Bool -> m a -> m (Maybe a)
skipIf (UWORD
size UWORD -> UWORD -> Bool
forall a. Ord a => a -> a -> Bool
< UWORD
40) (m [UBYTE] -> m (Maybe [UBYTE])) -> m [UBYTE] -> m (Maybe [UBYTE])
forall a b. (a -> b) -> a -> b
$ (PTR -> m UBYTE) -> [PTR] -> m [UBYTE]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM PTR -> m UBYTE
forall (m :: * -> *). Reader m => Peek m UBYTE
peekUBYTE ([PTR] -> m [UBYTE]) -> [PTR] -> m [UBYTE]
forall a b. (a -> b) -> a -> b
$ PTR -> PTR -> Int -> [PTR]
pointerRange PTR
p PTR
1 Int
40
  MMDInstrInfo -> m MMDInstrInfo
forall (m :: * -> *) a. Monad m => a -> m a
return (MMDInstrInfo -> m MMDInstrInfo) -> MMDInstrInfo -> m MMDInstrInfo
forall a b. (a -> b) -> a -> b
$ Maybe [UBYTE] -> MMDInstrInfo
MMDInstrInfo
    Maybe [UBYTE]
name'