DimensionalHash 0.1.4 → 0.1.5
raw patch · 2 files changed
+34/−14 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- Data/DimensionalHash.hs +33/−13
- DimensionalHash.cabal +1/−1
Data/DimensionalHash.hs view
@@ -14,24 +14,34 @@ import Control.Exception import Data.Typeable --- | recursevely compute the morton number. -class (Bits a, Integral a) => (MortonNumber a) where +------------------------------------------------------------------------ + +class (Bits a, Integral a) => (MortonNumber a) where + -- | recursevely compute the morton number. dimensionalHash :: (Bits a) => [a] -> a - dimensionalHash [] = 0 - dimensionalHash list = hash list 0 (bitSize (head list)) + dimensionalHash [] = 0 + dimensionalHash list = hash list 0 (bitSize (head list)) + -- | compute max bit size for the element of the list maxBitSize :: (Bits a) => [a] -> Int maxBitSize list = div (bitSize (head list)) (length list) + -- | compute max size for the element of the list maxSize :: (Bits a) => [a] -> Int maxSize list = 2 ^ (maxBitSize list) + -- | returns true if the list is hashable + -- A list is hashable IIF for every element x the condition : + -- x > (maxSize list) holds true. isHashable :: (Bits a) => [a] -> Bool isHashable [x] = True isHashable list = (length filteredList) == 0 where filteredList = filter (\x -> (fromIntegral x) > (maxSize list)) list +------------------------------------------------------------------------ +-- | + -- Integer haven't a fixed bitsize instance MortonNumber Integer where dimensionalHash list = hash list 0 32 @@ -48,24 +58,34 @@ instance MortonNumber Word32 instance MortonNumber Word64 +------------------------------------------------------------------------ +-- | recursevely compute the morton number. + hash :: (Bits a) => [a] -> Int -> Int -> a hash list n precision - | length list == 1 = head list - | n < precision = (concatBits list n) .|. (hash list (n + 1) precision) - | otherwise = 0 + | length list == 1 = head list + | n < precision = (concatBits list n) .|. (hash list (n + 1) precision) + | otherwise = 0 +------------------------------------------------------------------------ -- |Return a list have been shifted elements by n + index + concatBits :: (Bits a) => [a] -> Int -> a concatBits list n = foldl (\acc x -> acc .|. x) 0 shiftedMap where - shiftedMap = shiftElements mapList (n * ((length list) - 1)) - mapList = map (\x -> (takeBitAt x n)) list + shiftedMap = shiftElements mapList (n * ((length list) - 1)) + mapList = map (\x -> (takeBitAt x n)) list +------------------------------------------------------------------------ -- |Return a list have shifted elements by (n + index) + shiftElements :: (Bits a) => [a] -> Int -> [a] -shiftElements [] n = [] -shiftElements (x:xs) n = [(shiftL x n)] ++ (shiftElements xs (n+1)) +shiftElements [] n = [] +shiftElements (x:xs) n = [(shiftL x n)] ++ (shiftElements xs (n+1)) --- |Return an element having all bits set to 0, excepting the bit at n +------------------------------------------------------------------------ +-- |Return an element having all bits set to 0, except the bit at index n + takeBitAt :: (Bits a) => a -> Int -> a -takeBitAt x n = x .&. (shiftL 1 n)+takeBitAt x n = x .&. (shiftL 1 n) +
DimensionalHash.cabal view
@@ -1,5 +1,5 @@ name: DimensionalHash -version: 0.1.4 +version: 0.1.5 build-Type: Simple cabal-version: >= 1.6 tested-with: GHC == 7.0.3