factor/basis/persistent/hashtables/nodes/collision/collision.factor

56 lines
1.8 KiB
Factor
Raw Normal View History

2008-08-06 02:06:14 -04:00
! Based on Clojure's PersistentHashMap by Rich Hickey.
2008-09-05 20:29:14 -04:00
USING: kernel accessors math arrays fry sequences
2008-08-06 02:06:14 -04:00
locals persistent.sequences
persistent.hashtables.config
persistent.hashtables.nodes
persistent.hashtables.nodes.leaf ;
IN: persistent.hashtables.nodes.collision
: find-index ( key hashcode collision-node -- n leaf-node )
2008-09-10 23:11:40 -04:00
leaves>> -rot '[ [ _ _ ] dip matching-key? ] find ; inline
2008-08-06 02:06:14 -04:00
M:: collision-node (entry-at) ( key hashcode collision-node -- leaf-node )
key hashcode collision-node find-index nip ;
M:: collision-node (pluck-at) ( key hashcode collision-node -- leaf-node )
2008-08-06 05:46:44 -04:00
hashcode collision-node hashcode>> eq? [
2009-10-27 22:50:31 -04:00
key hashcode collision-node find-index drop :> idx
idx [
idx collision-node leaves>> smash [
collision-node hashcode>>
<collision-node>
] when
] [ collision-node ] if
2008-08-06 02:06:14 -04:00
] [ collision-node ] if ;
M:: collision-node (new-at) ( shift value key hashcode collision-node -- node' added-leaf )
2008-08-06 05:46:44 -04:00
hashcode collision-node hashcode>> eq? [
key hashcode collision-node find-index :> ( idx leaf-node )
2009-10-27 22:50:31 -04:00
idx [
value leaf-node value>> = [
collision-node f
2008-08-06 02:06:14 -04:00
] [
2009-10-27 22:50:31 -04:00
hashcode
value key hashcode <leaf-node>
idx
collision-node leaves>>
new-nth
<collision-node>
f
2008-08-06 02:06:14 -04:00
] if
2009-10-27 22:50:31 -04:00
] [
value key hashcode <leaf-node> :> new-leaf-node
hashcode
collision-node leaves>>
new-leaf-node
suffix
<collision-node>
new-leaf-node
] if
2008-08-06 02:06:14 -04:00
] [
shift collision-node value key hashcode make-bitmap-node
] if ;
M: collision-node >alist% leaves>> >alist-each% ;