module Sound.MED.Raw.BlockCmdPageTable where

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

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

import Control.Monad (liftM)

data BlockCmdPageTable = BlockCmdPageTable
  { BlockCmdPageTable -> UWORD
num_pages :: UWORD
  , BlockCmdPageTable -> UWORD
reserved  :: UWORD
  , BlockCmdPageTable -> [Maybe [[CmdPageData]]]
pages     :: [ Maybe [ [ CmdPageData ] ] ]
  }
  deriving (Int -> BlockCmdPageTable -> ShowS
[BlockCmdPageTable] -> ShowS
BlockCmdPageTable -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BlockCmdPageTable] -> ShowS
$cshowList :: [BlockCmdPageTable] -> ShowS
show :: BlockCmdPageTable -> String
$cshow :: BlockCmdPageTable -> String
showsPrec :: Int -> BlockCmdPageTable -> ShowS
$cshowsPrec :: Int -> BlockCmdPageTable -> ShowS
Show)

{-# SPECIALISE peek :: UWORD -> UWORD -> PTR -> StorableReader BlockCmdPageTable #-}
{-# SPECIALISE peek :: UWORD -> UWORD -> PTR -> ByteStringReader BlockCmdPageTable #-}
peek :: (Reader m) => UWORD -> UWORD -> PTR -> m BlockCmdPageTable
peek :: forall (m :: * -> *).
Reader m =>
UWORD -> UWORD -> PTR -> m BlockCmdPageTable
peek UWORD
tracks UWORD
numlines PTR
p = do
  UWORD
num_pages' <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD PTR
p
  UWORD
reserved'  <- forall (m :: * -> *). Reader m => Peek m UWORD
peekUWORD (PTR
pforall a. Num a => a -> a -> a
+PTR
2)
  [PTR]
pages''    <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM forall (m :: * -> *). Reader m => Peek m PTR
peekPTR forall a b. (a -> b) -> a -> b
$ forall i. Integral i => PTR -> PTR -> i -> [PTR]
pointerRangeGen (PTR
pforall a. Num a => a -> a -> a
+PTR
4) PTR
4 UWORD
num_pages'
  [Maybe [[CmdPageData]]]
pages'     <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (m :: * -> *).
Reader m =>
UWORD -> UWORD -> PTR -> m (Maybe [[CmdPageData]])
peekPage UWORD
tracks UWORD
numlines) [PTR]
pages''
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ UWORD -> UWORD -> [Maybe [[CmdPageData]]] -> BlockCmdPageTable
BlockCmdPageTable
    UWORD
num_pages' UWORD
reserved' [Maybe [[CmdPageData]]]
pages'

peekPage ::
  (Reader m) => UWORD -> UWORD -> PTR -> m (Maybe [ [ CmdPageData ] ])
peekPage :: forall (m :: * -> *).
Reader m =>
UWORD -> UWORD -> PTR -> m (Maybe [[CmdPageData]])
peekPage UWORD
tracks UWORD
numlines PTR
p =
  forall (m :: * -> *) a. Monad m => Bool -> m a -> m (Maybe a)
skipIf (PTR
p forall a. Eq a => a -> a -> Bool
== PTR
0) forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (forall i a. Integral i => i -> [a] -> [[a]]
chunk UWORD
tracks) 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 => PTR -> m CmdPageData
CmdPageData.peek forall a b. (a -> b) -> a -> b
$ forall i j.
(Integral i, Integral j) =>
PTR -> PTR -> i -> j -> [PTR]
pointerRangeGen2 PTR
p PTR
2 UWORD
tracks UWORD
numlines