]> gitweb.factorcode.org Git - factor.git/blob - basis/persistent/hashtables/nodes/leaf/leaf.factor
7fa4cfe40162ff037da8ab5be835389b7c2c1e8c
[factor.git] / basis / persistent / hashtables / nodes / leaf / leaf.factor
1 ! Based on Clojure's PersistentHashMap by Rich Hickey.
2
3 USING: kernel accessors locals math arrays namespaces
4 persistent.hashtables.config
5 persistent.hashtables.nodes ;
6 IN: persistent.hashtables.nodes.leaf
7
8 : matching-key? ( key hashcode leaf-node -- ? )
9     tuck hashcode>> eq? [ key>> = ] [ 2drop f ] if ; inline
10
11 M: leaf-node (entry-at) [ matching-key? ] keep and ;
12
13 M: leaf-node (pluck-at) [ matching-key? not ] keep and ;
14
15 M:: leaf-node (new-at) ( shift value key hashcode leaf-node -- node' added-leaf )
16     hashcode leaf-node hashcode>> eq? [
17         key leaf-node key>> = [
18             value leaf-node value>> =
19             [ leaf-node f ] [ value key hashcode <leaf-node> f ] if
20         ] [
21             [let | new-leaf [ value key hashcode <leaf-node> ] |
22                 hashcode leaf-node new-leaf 2array <collision-node>
23                 new-leaf
24             ]
25         ] if
26     ] [ shift leaf-node value key hashcode make-bitmap-node ] if ;
27
28 M: leaf-node >alist% [ key>> ] [ value>> ] bi 2array , ;