-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCircularBuffer.js
32 lines (31 loc) · 1.17 KB
/
CircularBuffer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
'use strict'
// Circular buffer storage. Externally-apparent 'length' increases indefinitely
// while any items with indexes below length-n will be forgotten (undefined
// will be returned if you try to get them, trying to set is an exception).
// n represents the initial length of the array, not a maximum
function CircularBuffer (n) {
this._array = new Array(n)
this.length = 0
this.size = n
}
CircularBuffer.prototype.toString = function () {
return '[object CircularBuffer(' + this._array.length + ') length ' + this.length + ']'
}
CircularBuffer.prototype.get = function (i) {
if (i < 0 || i < this.length - this._array.length) { return undefined }
return this._array[i % this._array.length]
}
CircularBuffer.prototype.push = function (v) {
this._array[this.length % this._array.length] = v
this.length++
}
CircularBuffer.prototype.set = function (i, v) {
if (i < 0 || i < this.length - this._array.length) { throw CircularBuffer.IndexError }
while (i > this.length) {
this._array[this.length % this._array.length] = undefined
this.length++
}
this._array[i % this._array.length] = v
if (i === this.length) { this.length++ }
}
CircularBuffer.IndexError = {}