{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric  #-}
module ZM.Type.Array(Array,Bytes) where
import           Data.Flat.Filler
import           Data.Model
import           ZM.Type.Generate
import qualified ZM.Type.Words    as Z

{-|An Array.

@
Array a  = A0
         | A1 a (Array a)
         | A2 a a (Array a)
         ...
         | A255 a ... (Array a)
@
-}
data Array a
instance Model a => Model (Array a) where envType = useCT arrayCT

-- |A byte-aligned byte array
data Bytes = Bytes (PreAligned (Array Z.Word8)) deriving (Generic,Model)

instance Model Filler
instance Model a => Model (PreAligned a)