{-# LANGUAGE DuplicateRecordFields #-}

module Data.Primitive.ByteArray.Offset
  ( -- * Types
    ByteArrayOffset (..)
  , MutableByteArrayOffset (..)
  ) where

import Data.Primitive (ByteArray, MutableByteArray)

{- | A byte array and an index into the array. The element
type is understood to be byte (an 8-bit word).
-}
data ByteArrayOffset = ByteArrayOffset
  { ByteArrayOffset -> ByteArray
array :: {-# UNPACK #-} !ByteArray
  , ByteArrayOffset -> Int
offset :: {-# UNPACK #-} !Int
  }

{- | A mutable byte array and an index into the array. The element
type is understood to be byte (an 8-bit word).
-}
data MutableByteArrayOffset s = MutableByteArrayOffset
  { forall s. MutableByteArrayOffset s -> MutableByteArray s
array :: {-# UNPACK #-} !(MutableByteArray s)
  , forall s. MutableByteArrayOffset s -> Int
offset :: {-# UNPACK #-} !Int
  }