packages feed

byteslice-0.2.13.1: src/Data/Bytes/Types.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}

module Data.Bytes.Types
  ( Bytes (..)
  , Bytes# (..)
  , MutableBytes (..)
  , UnmanagedBytes (..)
  , BytesN (..)
  , ByteArrayN (..)
  ) where

import Data.Bytes.Internal (Bytes (..))
import Data.Bytes.Internal.Show (showsSlice)
import Data.Primitive (ByteArray (..), MutableByteArray (..))
import Data.Primitive.Addr (Addr)
import Data.Proxy (Proxy (Proxy))
import GHC.Natural (naturalToInteger)
import GHC.TypeNats (KnownNat, Nat, natVal)
import Reps (Bytes# (..))

{- | A slice of a 'ByteArray' whose compile-time-known length is represented
by a phantom type variable. Consumers of this data constructor must be
careful to preserve the expected invariant.
-}
data BytesN (n :: Nat) = BytesN
  { array :: {-# UNPACK #-} !ByteArray
  , offset :: {-# UNPACK #-} !Int
  }

instance (KnownNat n) => Show (BytesN n) where
  showsPrec _ (BytesN arr off) s =
    let len = fromInteger (naturalToInteger (natVal (Proxy :: Proxy n)))
     in showsSlice arr off len s

{- | A 'ByteArray' whose compile-time-known length is represented
by a phantom type variable. Consumers of this data constructor must be
careful to preserve the expected invariant.
-}
newtype ByteArrayN (n :: Nat) = ByteArrayN
  { array :: ByteArray
  }

instance (KnownNat n) => Show (ByteArrayN n) where
  showsPrec _ (ByteArrayN arr) s =
    let len = fromInteger (naturalToInteger (natVal (Proxy :: Proxy n)))
     in showsSlice arr 0 len s

-- | A slice of a 'MutableByteArray'.
data MutableBytes s = MutableBytes
  { array :: {-# UNPACK #-} !(MutableByteArray s)
  , offset :: {-# UNPACK #-} !Int
  , length :: {-# UNPACK #-} !Int
  }

-- | A slice of unmanaged memory.
data UnmanagedBytes = UnmanagedBytes
  { address :: {-# UNPACK #-} !Addr
  , length :: {-# UNPACK #-} !Int
  }