| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | 'use strict'class Hoopy extends Array {  constructor (size) {    let index, isIndexOverflowed    if (! isPositiveInteger(size)) {      throw new TypeError('Argument `size` must be a positive integer.')    }    super(size)    this.grow = by => {      if (! isPositiveInteger(by)) {        throw new TypeError('Argument `by` must be a positive integer.')      }      let i      const newSize = size + by      for (i = size; i < newSize; ++i) {        this[i] = undefined      }      if (isIndexOverflowed) {        for (i = 0; i <= index; ++i) {          let j = size + i          if (j >= newSize) {            j %= newSize          }          this[j] = this[i]          this[i] = undefined        }      }      size = newSize    }    return new Proxy(this, {      get (target, key) {        if (isInteger(key)) {          return target[getIndex(key, size)]        }        return target[key]      },      set (target, key, value) {        if (isInteger(key)) {          index = getIndex(key, size)          target[index] = value          if (Math.abs(key) >= size) {            isIndexOverflowed = true          } else {            isIndexOverflowed = false          }        } else {          target[key] = value        }        return true      }    })  }}function isPositiveInteger (thing) {  return isInteger(thing) && thing > 0}function isInteger (thing) {  try {    return +thing % 1 === 0  } catch (error) {    // Coercing symbols to numbers throws an error  }  return false}function getIndex (key, size) {  if (key === 0) {    return 0  }  if (key < 0) {    return (size - Math.abs(key)) % size  }  return key % size}function nop () {  throw new Error('Not implemented')}Hoopy.prototype.push = nopHoopy.prototype.pop = nopHoopy.prototype.shift = nopHoopy.prototype.unshift = nopmodule.exports = Hoopy
 |