diff --git a/v3/src/structs/ProcessQueue.js b/v3/src/structs/ProcessQueue.js new file mode 100644 index 000000000..cc15330f7 --- /dev/null +++ b/v3/src/structs/ProcessQueue.js @@ -0,0 +1,99 @@ +// Phaser.Structs.ProcessQueue + +var Class = require('../utils/Class'); + +var ProcessQueue = new Class({ + + initialize: + + function ProcessQueue () + { + this._pending = []; + this._active = []; + this._destroy = []; + + this._toProcess = 0; + }, + + add: function (item) + { + this._pending.push(item); + + this._toProcess++; + + return this; + }, + + remove: function (item) + { + this._destroy.push(item); + + this._toProcess++; + + return this; + }, + + update: function () + { + if (this._toProcess === 0) + { + // Quick bail + return this._active; + } + + var list = this._destroy; + var active = this._active; + var i; + var item; + + // Clear the 'destroy' list + for (i = 0; i < list.length; i++) + { + item = list[i]; + + // Remove from the 'active' array + var idx = active.indexOf(item); + + if (idx !== -1) + { + active.splice(idx, 1); + } + } + + list.length = 0; + + // Process the pending addition list + // This stops callbacks and out of sync events from populating the active array mid-way during an update + + list = this._pending; + + for (i = 0; i < list.length; i++) + { + item = list[i]; + + this._active.push(item); + } + + list.length = 0; + + this._toProcess = 0; + + // The owner of this queue can now safely do whatever it needs to with the active list + return this._active; + }, + + getActive: function () + { + return this._active; + }, + + destroy: function () + { + this._pending = []; + this._active = []; + this._destroy = []; + } + +}); + +module.exports = ProcessQueue; diff --git a/v3/src/structs/index.js b/v3/src/structs/index.js index 61a103542..8ecd4f1db 100644 --- a/v3/src/structs/index.js +++ b/v3/src/structs/index.js @@ -2,7 +2,9 @@ module.exports = { + List: require('./List'), Map: require('./Map'), + ProcessQueue: require('./ProcessQueue'), RTree: require('./RTree'), Set: require('./Set')