58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2005, 2007 Slava Pestov.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								IN: queues
							 | 
						||
| 
								 | 
							
								USING: kernel inspector ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: entry obj next ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <entry> ( obj -- entry ) f entry construct-boa ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: queue head tail ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <queue> ( -- queue ) queue construct-empty ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: queue-empty? ( queue -- ? ) queue-head not ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (enque) ( entry queue -- )
							 | 
						||
| 
								 | 
							
								    [ set-queue-head ] 2keep set-queue-tail ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: clear-queue ( queue -- )
							 | 
						||
| 
								 | 
							
								    f swap (enque) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: enque ( elt queue -- )
							 | 
						||
| 
								 | 
							
								    >r <entry> r> dup queue-empty? [
							 | 
						||
| 
								 | 
							
								        (enque)
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        [ queue-tail set-entry-next ] 2keep set-queue-tail
							 | 
						||
| 
								 | 
							
								    ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: clear-entry ( entry -- )
							 | 
						||
| 
								 | 
							
								    f over set-entry-obj f swap set-entry-next ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: (deque) ( queue -- )
							 | 
						||
| 
								 | 
							
								    dup queue-head over queue-tail eq? [
							 | 
						||
| 
								 | 
							
								        clear-queue
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        dup queue-head dup entry-next rot set-queue-head
							 | 
						||
| 
								 | 
							
								        clear-entry
							 | 
						||
| 
								 | 
							
								    ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: empty-queue-error ;
							 | 
						||
| 
								 | 
							
								: empty-queue-error ( -- * )
							 | 
						||
| 
								 | 
							
								    \ empty-queue-error construct-empty throw ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: deque ( queue -- elt )
							 | 
						||
| 
								 | 
							
								    dup queue-empty? [
							 | 
						||
| 
								 | 
							
								        empty-queue-error
							 | 
						||
| 
								 | 
							
								    ] [
							 | 
						||
| 
								 | 
							
								        dup queue-head entry-obj >r (deque) r>
							 | 
						||
| 
								 | 
							
								    ] if ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: empty-queue-error summary
							 | 
						||
| 
								 | 
							
								    drop "Empty queue" ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: queue-each ( queue quot -- )
							 | 
						||
| 
								 | 
							
								    over queue-empty?
							 | 
						||
| 
								 | 
							
								    [ 2drop ] [ [ >r deque r> call ] 2keep queue-each ] if ;
							 | 
						||
| 
								 | 
							
								    inline
							 |