content: {-# LANGUAGE CPP #-}
  {-# OPTIONS_GHC -Wno-orphans #-}
  
  module Data.Primitive.ByteArray.Extra where
  
  import Data.Binary (Binary(..))
  import Data.Primitive.ByteArray (ByteArray)
  import GHC.Exts (IsList(..))
  
  #if !MIN_VERSION_primitive(0,7,1)
  import Control.DeepSeq (NFData(..))
  #endif
  
  -- hashable 1.4.2 defines Hashable for Data.Array.Byte.ByteArray, either from
  -- base or from the data-array-byte compat package for GHC < 9.4.
  -- primitive 0.8.0.0 re-exports this ByteArray.
  #if !MIN_VERSION_primitive(0,8,0)
  -- In primitive < 0.8.0.0, its ByteArray is a distinct type from
  -- Data.Array.Byte.ByteArray (insofar as the latter even exists).
  #define DEFINE_HASHABLE_BYTEARRAY
  #elif !MIN_VERSION_hashable(1,4,1)
  -- hashable < 1.4.1 doesn't define a Hashable ByteArray instance at all.
  #define DEFINE_HASHABLE_BYTEARRAY
  #elif !MIN_VERSION_hashable(1,4,2)
  -- hashable 1.4.1 defines hashable for the ByteArray added to base 4.17.
  #if !MIN_VERSION_base(4,17,0)
  #define DEFINE_HASHABLE_BYTEARRAY
  #endif
  #endif
  
  #ifdef DEFINE_HASHABLE_BYTEARRAY
  import Data.Hashable (Hashable(..))
  #endif
  
  #if !MIN_VERSION_primitive(0,7,1)
  instance NFData ByteArray where
    rnf x = x `seq` ()
  #endif
  
  instance Binary ByteArray where
    get = fmap fromList get
    put = put . toList
  
  #ifdef DEFINE_HASHABLE_BYTEARRAY
  instance Hashable ByteArray where
    hashWithSalt salt = hashWithSalt salt . toList
  #endif
  