1 ! Based on Clojure's PersistentHashMap by Rich Hickey.
3 USING: kernel accessors math arrays fry sequences
4 locals persistent.sequences
5 persistent.hashtables.config
6 persistent.hashtables.nodes
7 persistent.hashtables.nodes.leaf ;
8 IN: persistent.hashtables.nodes.collision
10 : find-index ( key hashcode collision-node -- n leaf-node )
11 leaves>> -rot '[ [ _ _ ] dip matching-key? ] find ; inline
13 M:: collision-node (entry-at) ( key hashcode collision-node -- leaf-node )
14 key hashcode collision-node find-index nip ;
16 M:: collision-node (pluck-at) ( key hashcode collision-node -- leaf-node )
17 hashcode collision-node hashcode>> eq? [
18 [let | idx [ key hashcode collision-node find-index drop ] |
20 idx collision-node leaves>> smash [
21 collision-node hashcode>>
24 ] [ collision-node ] if
26 ] [ collision-node ] if ;
28 M:: collision-node (new-at) ( shift value key hashcode collision-node -- node' added-leaf )
29 hashcode collision-node hashcode>> eq? [
30 key hashcode collision-node find-index
31 [let | leaf-node [ ] idx [ ] |
33 value leaf-node value>> = [
37 value key hashcode <leaf-node>
39 collision-node leaves>>
45 [let | new-leaf-node [ value key hashcode <leaf-node> ] |
47 collision-node leaves>>
56 shift collision-node value key hashcode make-bitmap-node
59 M: collision-node >alist% leaves>> >alist-each% ;