90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								IN: dequeues
							 | 
						||
| 
								 | 
							
								USING: help.markup help.syntax kernel ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ARTICLE: "dequeues" "Dequeues"
							 | 
						||
| 
								 | 
							
								"A dequeue is a data structure with constant-time insertion and removal of elements at both ends. Dequeue operations are defined in the " { $vocab-link "dequeues" } " vocabulary."
							 | 
						||
| 
								 | 
							
								$nl
							 | 
						||
| 
								 | 
							
								"Dequeues must be instances of a mixin class:"
							 | 
						||
| 
								 | 
							
								{ $subsection dequeue }
							 | 
						||
| 
								 | 
							
								"Dequeues must implement a protocol."
							 | 
						||
| 
								 | 
							
								$nl
							 | 
						||
| 
								 | 
							
								"Querying the dequeue:"
							 | 
						||
| 
								 | 
							
								{ $subsection peek-front }
							 | 
						||
| 
								 | 
							
								{ $subsection peek-back }
							 | 
						||
| 
								 | 
							
								{ $subsection dequeue-length }
							 | 
						||
| 
								 | 
							
								{ $subsection dequeue-member? }
							 | 
						||
| 
								 | 
							
								"Adding and removing elements:"
							 | 
						||
| 
								 | 
							
								{ $subsection push-front* }
							 | 
						||
| 
								 | 
							
								{ $subsection push-back* }
							 | 
						||
| 
								 | 
							
								{ $subsection pop-front* }
							 | 
						||
| 
								 | 
							
								{ $subsection pop-back* }
							 | 
						||
| 
								 | 
							
								{ $subsection clear-dequeue }
							 | 
						||
| 
								 | 
							
								"Working with node objects output by " { $link push-front* } " and " { $link push-back* } ":"
							 | 
						||
| 
								 | 
							
								{ $subsection delete-node }
							 | 
						||
| 
								 | 
							
								{ $subsection node-value }
							 | 
						||
| 
								 | 
							
								"Utility operations built in terms of the above:"
							 | 
						||
| 
								 | 
							
								{ $subsection dequeue-empty? }
							 | 
						||
| 
								 | 
							
								{ $subsection push-front }
							 | 
						||
| 
								 | 
							
								{ $subsection push-all-front }
							 | 
						||
| 
								 | 
							
								{ $subsection push-back }
							 | 
						||
| 
								 | 
							
								{ $subsection push-all-back }
							 | 
						||
| 
								 | 
							
								{ $subsection pop-front }
							 | 
						||
| 
								 | 
							
								{ $subsection pop-back }
							 | 
						||
| 
								 | 
							
								{ $subsection slurp-dequeue }
							 | 
						||
| 
								 | 
							
								"When using a dequeue as a queue, the convention is to queue elements with " { $link push-front } " and dequeue them with " { $link pop-back } "." ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ABOUT: "dequeues"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: dequeue-empty?
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" { $link dequeue } } { "?" "a boolean" } }
							 | 
						||
| 
								 | 
							
								{ $description "Returns true if a dequeue is empty." }
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: push-front
							 | 
						||
| 
								 | 
							
								{ $values { "obj" object } { "dequeue" dequeue } }
							 | 
						||
| 
								 | 
							
								{ $description "Push the object onto the front of the dequeue." } 
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: push-front*
							 | 
						||
| 
								 | 
							
								{ $values { "obj" object } { "dequeue" dequeue } { "node" "a node" } }
							 | 
						||
| 
								 | 
							
								{ $description "Push the object onto the front of the dequeue and return the newly created node." } 
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: push-back
							 | 
						||
| 
								 | 
							
								{ $values { "obj" object } { "dequeue" dequeue } }
							 | 
						||
| 
								 | 
							
								{ $description "Push the object onto the back of the dequeue." } 
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: push-back*
							 | 
						||
| 
								 | 
							
								{ $values { "obj" object } { "dequeue" dequeue } { "node" "a node" } }
							 | 
						||
| 
								 | 
							
								{ $description "Push the object onto the back of the dequeue and return the newly created node." } 
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: peek-front
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" dequeue } { "obj" object } }
							 | 
						||
| 
								 | 
							
								{ $description "Returns the object at the front of the dequeue." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: pop-front
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" dequeue } { "obj" object } }
							 | 
						||
| 
								 | 
							
								{ $description "Pop the object off the front of the dequeue and return the object." }
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: pop-front*
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" dequeue } }
							 | 
						||
| 
								 | 
							
								{ $description "Pop the object off the front of the dequeue." }
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: peek-back
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" dequeue } { "obj" object } }
							 | 
						||
| 
								 | 
							
								{ $description "Returns the object at the back of the dequeue." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: pop-back
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" dequeue } { "obj" object } }
							 | 
						||
| 
								 | 
							
								{ $description "Pop the object off the back of the dequeue and return the object." }
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HELP: pop-back*
							 | 
						||
| 
								 | 
							
								{ $values { "dequeue" dequeue } }
							 | 
						||
| 
								 | 
							
								{ $description "Pop the object off the back of the dequeue." }
							 | 
						||
| 
								 | 
							
								{ $notes "This operation is O(1)." } ;
							 |