factor/basis/persistent/hashtables/nodes/leaf/leaf.factor

29 lines
998 B
Factor
Raw Normal View History

2008-08-06 02:06:14 -04:00
! Based on Clojure's PersistentHashMap by Rich Hickey.
2008-09-10 23:11:40 -04:00
USING: kernel accessors locals math arrays namespaces make
2008-08-06 02:06:14 -04:00
persistent.hashtables.config
persistent.hashtables.nodes ;
IN: persistent.hashtables.nodes.leaf
: matching-key? ( key hashcode leaf-node -- ? )
2009-01-23 19:20:47 -05:00
[ nip ] [ hashcode>> eq? ] 2bi
[ key>> = ] [ 2drop f ] if ; inline
2008-08-06 02:06:14 -04:00
M: leaf-node (entry-at) [ matching-key? ] keep and ;
M: leaf-node (pluck-at) [ matching-key? not ] keep and ;
M:: leaf-node (new-at) ( shift value key hashcode leaf-node -- node' added-leaf )
hashcode leaf-node hashcode>> eq? [
key leaf-node key>> = [
value leaf-node value>> =
[ leaf-node f ] [ value key hashcode <leaf-node> f ] if
] [
2009-10-27 22:50:31 -04:00
value key hashcode <leaf-node> :> new-leaf
hashcode leaf-node new-leaf 2array <collision-node>
new-leaf
2008-08-06 02:06:14 -04:00
] if
] [ shift leaf-node value key hashcode make-bitmap-node ] if ;
M: leaf-node >alist% [ key>> ] [ value>> ] bi 2array , ;