{-# OPTIONS_HADDOCK prune #-}
module Data.PerfectHash.Lookup (
LookupTable (LookupTable, nonces, values)
, size
, encodeDirectEntry
, lookup
) where
import Data.Vector (Vector, (!))
import qualified Data.Vector as Vector
import Prelude hiding (lookup)
import Data.PerfectHash.Types.Nonces (Nonce (Nonce))
import qualified Data.PerfectHash.Hashing as Hashing
import qualified Data.PerfectHash.Types.Nonces as Nonces
data LookupTable a = LookupTable {
LookupTable a -> Vector Int
nonces :: Vector Int
, LookupTable a -> Vector a
values :: Vector a
}
size :: LookupTable a -> Hashing.ArraySize
size :: LookupTable a -> ArraySize
size = Int -> ArraySize
Hashing.ArraySize (Int -> ArraySize)
-> (LookupTable a -> Int) -> LookupTable a -> ArraySize
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> Int
forall a. Vector a -> Int
Vector.length (Vector a -> Int)
-> (LookupTable a -> Vector a) -> LookupTable a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LookupTable a -> Vector a
forall a. LookupTable a -> Vector a
values
encodeDirectEntry :: Hashing.SlotIndex -> Int
encodeDirectEntry :: SlotIndex -> Int
encodeDirectEntry (Hashing.SlotIndex Int
val) =
Int -> Int -> Int
forall a. Num a => a -> a -> a
subtract Int
1 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int -> Int
forall a. Num a => a -> a
negate Int
val
decodeDirectEntry :: Int -> Hashing.SlotIndex
decodeDirectEntry :: Int -> SlotIndex
decodeDirectEntry Int
val =
Int -> SlotIndex
Hashing.SlotIndex (Int -> SlotIndex) -> Int -> SlotIndex
forall a b. (a -> b) -> a -> b
$ SlotIndex -> Int
encodeDirectEntry (SlotIndex -> Int) -> SlotIndex -> Int
forall a b. (a -> b) -> a -> b
$ Int -> SlotIndex
Hashing.SlotIndex Int
val
lookup
:: (Hashing.ToHashableChunks a)
=> LookupTable b
-> a
-> b
lookup :: LookupTable b -> a -> b
lookup LookupTable b
lookup_table a
key =
LookupTable b -> Vector b
forall a. LookupTable a -> Vector a
values LookupTable b
lookup_table Vector b -> Int -> b
forall a. Vector a -> Int -> a
! Int
v_key
where
table_size :: ArraySize
table_size = LookupTable b -> ArraySize
forall a. LookupTable a -> ArraySize
size LookupTable b
lookup_table
Hashing.SlotIndex Int
nonce_index = Nonce -> ArraySize -> a -> SlotIndex
forall a.
ToHashableChunks a =>
Nonce -> ArraySize -> a -> SlotIndex
Hashing.hashToSlot (Int -> Nonce
Nonce Int
0) ArraySize
table_size a
key
nonce :: Int
nonce = LookupTable b -> Vector Int
forall a. LookupTable a -> Vector Int
nonces LookupTable b
lookup_table Vector Int -> Int -> Int
forall a. Vector a -> Int -> a
! Int
nonce_index
Hashing.SlotIndex Int
v_key = if Int -> Bool
Nonces.isDirectSlot Int
nonce
then Int -> SlotIndex
decodeDirectEntry Int
nonce
else Nonce -> ArraySize -> a -> SlotIndex
forall a.
ToHashableChunks a =>
Nonce -> ArraySize -> a -> SlotIndex
Hashing.hashToSlot (Int -> Nonce
Nonces.Nonce Int
nonce) ArraySize
table_size a
key