|  | @@ -4919,47 +4919,50 @@ smalltalk.Set);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addClass('Queue', smalltalk.Object, ['read', 'readIndex', 'write'], 'Kernel-Collections');
 | 
	
		
			
				|  |  | -smalltalk.Queue.comment="A Queue am a one-sided queue.\x0a\x0aA Queue uses two OrderedCollections inside,\x0a`read` is at the front, is not modified and only read using `readIndex`.\x0a`write` is at the back and is appended new items.\x0aWhen `read` is exhausted, `write` is promoted to `read` and new `write` is created.\x0a\x0aAs a consequence, no data moving is done by the Queue; write appending may do data moving\x0awhen growing `write`, but this is left to engine to implement as good as it chooses to."
 | 
	
		
			
				|  |  | +smalltalk.Queue.comment="I am a one-sided queue.\x0a\x0a## Usage\x0a\x0aUse `#nextPut:` to add items to the queue.\x0aUse `#next` or `#nextIfAbsent:` to get (and remove) the next item in the queue.\x0a\x0a## Implementation notes\x0a\x0aA Queue uses two OrderedCollections inside,\x0a`read` is at the front, is not modified and only read using `readIndex`.\x0a`write` is at the back and is appended new items.\x0aWhen `read` is exhausted, `write` is promoted to `read` and new `write` is created.\x0a\x0aAs a consequence, no data moving is done by me, write appending may do data moving\x0awhen growing `write`, but this is left to engine to implement as good as it chooses to."
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_back_",
 | 
	
		
			
				|  |  | +"_initialize",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "back:",
 | 
	
		
			
				|  |  | -category: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (anObject){
 | 
	
		
			
				|  |  | +selector: "initialize",
 | 
	
		
			
				|  |  | +category: 'initialization',
 | 
	
		
			
				|  |  | +fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx1) { 
_st(self["@write"])._add_(anObject);
 | 
	
		
			
				|  |  | -return self}, function($ctx1) {$ctx1.fill(self,"back:",{anObject:anObject},smalltalk.Queue)})},
 | 
	
		
			
				|  |  | -args: ["anObject"],
 | 
	
		
			
				|  |  | -source: "back: anObject\x0a\x09write add: anObject",
 | 
	
		
			
				|  |  | -messageSends: ["add:"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 | 
	
		
			
				|  |  | +self["@read"]=_st((smalltalk.OrderedCollection || OrderedCollection))._new();
 | 
	
		
			
				|  |  | +self["@write"]=_st((smalltalk.OrderedCollection || OrderedCollection))._new();
 | 
	
		
			
				|  |  | +self["@readIndex"]=(1);
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.Queue)})},
 | 
	
		
			
				|  |  | +args: [],
 | 
	
		
			
				|  |  | +source: "initialize\x0a\x09super initialize.\x0a\x09read := OrderedCollection new.\x0a\x09write := OrderedCollection new.\x0a\x09readIndex := 1",
 | 
	
		
			
				|  |  | +messageSends: ["initialize", "new"],
 | 
	
		
			
				|  |  | +referencedClasses: ["OrderedCollection"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.Queue);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_front",
 | 
	
		
			
				|  |  | +"_next",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "front",
 | 
	
		
			
				|  |  | +selector: "next",
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
var $1;
 | 
	
		
			
				|  |  | -$1=_st(self)._frontIfAbsent_((function(){
 | 
	
		
			
				|  |  | +$1=_st(self)._nextIfAbsent_((function(){
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx2) {
return _st(self)._error_("Cannot read from empty Queue.");
 | 
	
		
			
				|  |  |  }, function($ctx2) {$ctx2.fillBlock({},$ctx1)})}));
 | 
	
		
			
				|  |  |  return $1;
 | 
	
		
			
				|  |  | -}, function($ctx1) {$ctx1.fill(self,"front",{},smalltalk.Queue)})},
 | 
	
		
			
				|  |  | +}, function($ctx1) {$ctx1.fill(self,"next",{},smalltalk.Queue)})},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "front\x0a\x09^self frontIfAbsent: [ self error: 'Cannot read from empty Queue.' ]",
 | 
	
		
			
				|  |  | -messageSends: ["frontIfAbsent:", "error:"],
 | 
	
		
			
				|  |  | +source: "next\x0a\x09^self nextIfAbsent: [ self error: 'Cannot read from empty Queue.' ]",
 | 
	
		
			
				|  |  | +messageSends: ["nextIfAbsent:", "error:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.Queue);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_frontIfAbsent_",
 | 
	
		
			
				|  |  | +"_nextIfAbsent_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "frontIfAbsent:",
 | 
	
		
			
				|  |  | +selector: "nextIfAbsent:",
 | 
	
		
			
				|  |  |  category: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (aBlock){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
	
		
			
				|  | @@ -4994,30 +4997,27 @@ $4=result;
 | 
	
		
			
				|  |  |  return $4;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  catch(e) {if(e===$early)return e[0]; throw e}
 | 
	
		
			
				|  |  | -}, function($ctx1) {$ctx1.fill(self,"frontIfAbsent:",{aBlock:aBlock,result:result},smalltalk.Queue)})},
 | 
	
		
			
				|  |  | +}, function($ctx1) {$ctx1.fill(self,"nextIfAbsent:",{aBlock:aBlock,result:result},smalltalk.Queue)})},
 | 
	
		
			
				|  |  |  args: ["aBlock"],
 | 
	
		
			
				|  |  | -source: "frontIfAbsent: aBlock\x0a\x09| result |\x0a\x09result := read at: readIndex ifAbsent: [\x0a\x09\x09write isEmpty ifTrue: [\x0a\x09\x09\x09readIndex > 1 ifTrue: [ read := #(). readIndex := 1 ].\x0a\x09\x09\x09^aBlock value ].\x0a\x09\x09read := write.\x0a\x09\x09readIndex := 1.\x0a\x09\x09write := OrderedCollection new.\x0a\x09\x09read first ].\x0a\x09read at: readIndex put: nil.\x0a\x09readIndex := readIndex + 1.\x0a\x09^result",
 | 
	
		
			
				|  |  | +source: "nextIfAbsent: aBlock\x0a\x09| result |\x0a\x09result := read at: readIndex ifAbsent: [\x0a\x09\x09write isEmpty ifTrue: [\x0a\x09\x09\x09readIndex > 1 ifTrue: [ read := #(). readIndex := 1 ].\x0a\x09\x09\x09^aBlock value ].\x0a\x09\x09read := write.\x0a\x09\x09readIndex := 1.\x0a\x09\x09write := OrderedCollection new.\x0a\x09\x09read first ].\x0a\x09read at: readIndex put: nil.\x0a\x09readIndex := readIndex + 1.\x0a\x09^result",
 | 
	
		
			
				|  |  |  messageSends: ["at:ifAbsent:", "ifTrue:", ">", "value", "isEmpty", "new", "first", "at:put:", "+"],
 | 
	
		
			
				|  |  |  referencedClasses: ["OrderedCollection"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.Queue);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  | -"_initialize",
 | 
	
		
			
				|  |  | +"_nextPut_",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "initialize",
 | 
	
		
			
				|  |  | -category: 'initialization',
 | 
	
		
			
				|  |  | -fn: function (){
 | 
	
		
			
				|  |  | +selector: "nextPut:",
 | 
	
		
			
				|  |  | +category: 'accessing',
 | 
	
		
			
				|  |  | +fn: function (anObject){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx1) { 
smalltalk.Object.fn.prototype._initialize.apply(_st(self), []);
 | 
	
		
			
				|  |  | -self["@read"]=_st((smalltalk.OrderedCollection || OrderedCollection))._new();
 | 
	
		
			
				|  |  | -self["@write"]=_st((smalltalk.OrderedCollection || OrderedCollection))._new();
 | 
	
		
			
				|  |  | -self["@readIndex"]=(1);
 | 
	
		
			
				|  |  | -return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.Queue)})},
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "initialize\x0a\x09super initialize.\x0a\x09read := OrderedCollection new.\x0a\x09write := OrderedCollection new.\x0a\x09readIndex := 1",
 | 
	
		
			
				|  |  | -messageSends: ["initialize", "new"],
 | 
	
		
			
				|  |  | -referencedClasses: ["OrderedCollection"]
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
_st(self["@write"])._add_(anObject);
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"nextPut:",{anObject:anObject},smalltalk.Queue)})},
 | 
	
		
			
				|  |  | +args: ["anObject"],
 | 
	
		
			
				|  |  | +source: "nextPut: anObject\x0a\x09write add: anObject",
 | 
	
		
			
				|  |  | +messageSends: ["add:"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.Queue);
 | 
	
		
			
				|  |  |  
 |