Ticket #4874: HashMap.hs

File HashMap.hs, 1.0 KB (added by tibbe, 2 years ago)
Line 
1{-# LANGUAGE BangPatterns, CPP #-}
2module Data.HashMap
3    (
4      HashMap
5    , lookup
6    ) where
7
8import Data.Bits ((.&.))
9import Data.Hashable (Hashable(hash))
10import qualified Data.FullList as FL
11import Data.Word (Word)
12import Prelude hiding (lookup)
13
14data HashMap k v
15    = Nil
16    | Tip {-# UNPACK #-} !Hash
17          {-# UNPACK #-} !(FL.FullList k v)
18    | Bin {-# UNPACK #-} !Prefix
19          {-# UNPACK #-} !Mask
20          !(HashMap k v)
21          !(HashMap k v)
22
23type Prefix = Int
24type Mask   = Int
25type Hash   = Int
26
27lookup :: (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
28lookup k0 t = go h0 k0 t
29  where
30    h0 = hash k0
31    go !h !k (Bin _ m l r)
32      | zero h m  = go h k l
33      | otherwise = go h k r
34    go h k (Tip h' l)
35      | h == h'   = FL.lookup k l
36      | otherwise = Nothing
37    go _ _ Nil    = Nothing
38#if __GLASGOW_HASKELL__ >= 700
39{-# INLINABLE lookup #-}
40#endif
41
42zero :: Hash -> Mask -> Bool
43zero i m = (fromIntegral i :: Word) .&. (fromIntegral m :: Word) == 0
44{-# INLINE zero #-}