1 ! Based on Clojure's PersistentHashMap by Rich Hickey.
3 USING: math accessors kernel arrays sequences sequences.private
6 persistent.hashtables.config
7 persistent.hashtables.nodes ;
8 IN: persistent.hashtables.nodes.full
10 M:: full-node (new-at) ( shift value key hashcode full-node -- node' added-leaf )
11 [let* | nodes [ full-node nodes>> ]
12 idx [ hashcode full-node shift>> mask ]
13 n [ idx nodes nth-unsafe ] |
14 shift radix-bits + value key hashcode n (new-at)
15 [let | new-leaf [ ] n' [ ] |
19 n' idx nodes new-nth shift <full-node>
25 M:: full-node (pluck-at) ( key hashcode full-node -- node' )
26 [let* | idx [ hashcode full-node shift>> mask ]
27 n [ idx full-node nodes>> nth ]
28 n' [ key hashcode n (pluck-at) ] |
33 n' idx full-node nodes>> new-nth
37 hashcode full-node shift>> bitpos bitnot full-bitmap-mask bitand
38 idx full-node nodes>> remove-nth
45 M:: full-node (entry-at) ( key hashcode full-node -- node' )
47 hashcode full-node shift>> mask
48 full-node nodes>> nth-unsafe
51 M: full-node >alist% nodes>> >alist-each% ;