Queue = Class.create();

Object.extend(Queue.prototype, Enumerable);

Object.extend(Queue.prototype, {

  initialize: function() {

        //inspired by http://www.safalra.com/programming/javascript/queues/
        this.queue=[];
        this.queueSpace=0;
        this.length=0;

  },

  //array-like functions

  push:function(item,cursorName) {
        this.queue.push(item);

    return (++this.length);
  },

  shift:function() {
        if (this.queue.length){
      var element=this.queue[this.queueSpace];
      if (++this.queueSpace*2 >= this.queue.length){
        for (var i=this.queueSpace;i<this.queue.length;i++)
this.queue[i-this.queueSpace]=this.queue[i];
        this.queue.length-=this.queueSpace;
        this.queueSpace=0;
      }
      this.length--;

      return element;
    }else{
      return undefined;
    }
  },

  concat:function(elements) {
        return this.toArray().concat(elements);
  },

  unshift:function(element) {

        if (this.queueSpace>0) {
                this.queue[--this.queueSpace]=element;
        } else {
                this.queue.unshift(element);
        }
        return (++this.length);
  },
  pop:function() {
        this.length--;
        return this.queue.pop();
  },

  //Enumerable support
  _each: function(iterator) {
        for (var i = this.queueSpace, length = this.queue.length; i < length;
i++)
      iterator(this.queue[i]);
  },

  //addon methods

  //put the picked element in the first position, then dequeue.
  pick:function(index) {

    var element=this.queue[this.queueSpace+index];
    for (var i=(this.queueSpace+index);i>(this.queueSpace);i--)
this.queue[i]=this.queue[i-1];
    this.queue[this.queueSpace]=element;

    return this.shift();
  },

  pushArray:function(elements) {
    this.queue = this.queue.concat(elements);
    this.length+=elements.length;
    return this.toArray();
  },

  get:function(index) {
    return this.queue[this.queueSpace+index];
  },
  set:function(index,element) {
    this.queue[this.queueSpace+index]=element;
  },

  toArray:function() {
    return this.queue.slice(this.queueSpace);
  }

}); 



