1 ! Based on Clojure's PersistentHashMap by Rich Hickey.
3 USING: kernel accessors locals math arrays namespaces make
4 persistent.hashtables.config
5 persistent.hashtables.nodes ;
6 IN: persistent.hashtables.nodes.leaf
8 : matching-key? ( key hashcode leaf-node -- ? )
9 [ nip ] [ hashcode>> eq? ] 2bi
10 [ key>> = ] [ 2drop f ] if ; inline
12 M: leaf-node (entry-at) [ matching-key? ] keep and ;
14 M: leaf-node (pluck-at) [ matching-key? not ] keep and ;
16 M:: leaf-node (new-at) ( shift value key hashcode leaf-node -- node' added-leaf )
17 hashcode leaf-node hashcode>> eq? [
18 key leaf-node key>> = [
19 value leaf-node value>> =
20 [ leaf-node f ] [ value key hashcode <leaf-node> f ] if
22 value key hashcode <leaf-node> :> new-leaf
23 hashcode leaf-node new-leaf 2array <collision-node>
26 ] [ shift leaf-node value key hashcode make-bitmap-node ] if ;
28 M: leaf-node >alist% [ key>> ] [ value>> ] bi 2array , ;