more efficient hash-each

cvs
Slava Pestov 2005-06-13 02:06:03 +00:00
parent 68d034d7eb
commit 240eb8b626
2 changed files with 12 additions and 7 deletions

View File

@ -111,11 +111,9 @@ IN: hashtables
[ remove-assoc ] set-hash* ;
: hash-clear ( hash -- )
#! Remove all entries from a hashtable.
0 over set-hash-size [ f -rot set-hash-bucket ] each-bucket ;
: buckets>list ( hash -- list )
#! Push a list of key/value pairs in a hashtable.
hash-array >list ;
: alist>hash ( alist -- hash )
@ -123,16 +121,13 @@ IN: hashtables
[ unswons pick set-hash ] each ;
: hash-keys ( hash -- list )
#! Push a list of keys in a hashtable.
hash>alist [ car ] map ;
: hash-values ( hash -- alist )
#! Push a list of values in a hashtable.
hash>alist [ cdr ] map ;
: hash-each ( hash code -- )
#! Apply the code to each key/value pair of the hashtable.
>r hash>alist r> each ; inline
: hash-each ( hash quot -- )
swap hash-array [ swap each ] each-with ; inline
: hash-subset ( hash quot -- hash | quot: [[ k v ]] -- ? )
>r hash>alist r> subset alist>hash ;

View File

@ -119,3 +119,13 @@ f 100000000000000000000000000 "testhash" get set-hash
10 [ f f "f-hash-test" get set-hash ] times
[ 1 ] [ "f-hash-test" get hash-size ] unit-test
[ 21 ] [
0 {{
[[ 1 2 ]]
[[ 3 4 ]]
[[ 5 6 ]]
}} [
uncons + +
] hash-each
] unit-test