{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DerivingStrategies #-}
module Data.Bytes.HashMap.Internal
  ( Map(..)
  ) where

import Data.Int (Int32)
import Data.Primitive (ByteArray,PrimArray,SmallArray)
import Data.Primitive.Unlifted.Array (UnliftedArray)

-- | A static perfect hash table where the keys are byte arrays. This
--   table cannot be updated after its creation, but all lookups have
--   guaranteed O(1) worst-case cost. It consumes linear space. This
--   is an excellent candidate for use with compact regions.
data Map v = Map
  !ByteArray -- top-level entropy
  !(UnliftedArray ByteArray) -- entropies
  !(PrimArray Int32) -- offset to apply to hash, could probably be 32 bits
  !(UnliftedArray ByteArray) -- keys
  !(SmallArray v) -- values
  deriving stock (Functor,Foldable,Traversable)