32 lines
		
	
	
		
			820 B
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			32 lines
		
	
	
		
			820 B
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2008 Slava Pestov. | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | USING: accessors kernel sequences math math.order ;
 | ||
|  | IN: stack-checker.recursive-state.tree | ||
|  | 
 | ||
|  | ! Persistent unbalanced hash tree using eq? comparison. | ||
|  | ! We use this to speed up stack-checker.recursive-state. | ||
|  | ! Perhaps this should go somewhere else | ||
|  | 
 | ||
|  | TUPLE: node value key hashcode left right ;
 | ||
|  | 
 | ||
|  | GENERIC: lookup ( key node -- value/f )
 | ||
|  | 
 | ||
|  | M: f lookup nip ;
 | ||
|  | 
 | ||
|  | : decide ( key node -- key node ? )
 | ||
|  |     over hashcode over hashcode>> <= ; inline
 | ||
|  | 
 | ||
|  | M: node lookup | ||
|  |     2dup key>> eq?
 | ||
|  |     [ nip value>> ] | ||
|  |     [ decide [ left>> ] [ right>> ] if lookup ] if ;
 | ||
|  | 
 | ||
|  | GENERIC: store ( value key node -- node' )
 | ||
|  | 
 | ||
|  | M: f store drop dup hashcode f f node boa ;
 | ||
|  | 
 | ||
|  | M: node store | ||
|  |     clone decide | ||
|  |     [ [ store ] change-left ] | ||
|  |     [ [ store ] change-right ] if ;
 |