: hash@ ( key array -- i )
[ hashcode >fixnum dup fixnum+fast ] dip wrap ; inline
-: probe ( array i -- array i )
- 2 fixnum+fast over wrap ; inline
+: probe ( array i probe# -- array i' probe# )
+ 2 fixnum+fast [ fixnum+fast over wrap ] keep ; inline
: no-key ( key array -- array n ? ) nip f f ; inline
-: (key@) ( key array i -- array n ? )
- 3dup swap array-nth
- dup ((empty)) eq?
- [ 3drop no-key ] [
- = [ rot drop t ] [ probe (key@) ] if
+: (key@) ( key array i probe# -- array n ? )
+ [ 3dup swap array-nth ] dip over ((empty)) eq?
+ [ drop 3drop no-key ] [
+ [ = ] dip swap
+ [ drop rot drop t ]
+ [ probe (key@) ]
+ if
] if ; inline recursive
: key@ ( key hash -- array n ? )
array>> dup length>> 0 eq?
- [ no-key ] [ 2dup hash@ (key@) ] if ; inline
+ [ no-key ] [ 2dup hash@ 0 (key@) ] if ; inline
: <hash-array> ( n -- array )
1 + next-power-of-2 4 * ((empty)) <array> ; inline
: reset-hash ( n hash -- )
swap <hash-array> >>array init-hash ; inline
-: (new-key@) ( key keys i -- keys n empty? )
- 3dup swap array-nth dup ((empty)) eq? [
- 2drop rot drop t
- ] [
- = [
- rot drop f
- ] [
- probe (new-key@)
- ] if
+: (new-key@) ( key array i probe# -- array i empty? )
+ [ 3dup swap array-nth ] dip over ((empty)) eq?
+ [ 3drop rot drop t ] [
+ [ = ] dip swap
+ [ drop rot drop f ]
+ [ probe (new-key@) ]
+ if
] if ; inline recursive
: new-key@ ( key hash -- array n empty? )
- array>> 2dup hash@ (new-key@) ; inline
+ array>> 2dup hash@ 0 (new-key@) ; inline
: set-nth-pair ( value key seq n -- )
2 fixnum+fast [ set-slot ] 2keep