extra-array-view
Version:
An array view is a proxy to an underlying array.
155 lines (153 loc) • 4.56 kB
JavaScript
class RawArrayView {
constructor(x, i = 0, I = x.length) {
this.base = x;
this.begin = i;
this.end = I;
}
[Symbol.iterator]() {
return this.base.slice(this.begin, this.end)[Symbol.iterator]();
}
keys() {
return this.base.slice(this.begin, this.end).keys();
}
values() {
return this.base.slice(this.begin, this.end).values();
}
entries() {
return this.base.slice(this.begin, this.end).entries();
}
index(i) {
return i >= 0 ? Math.min(this.begin + i, this.end) : Math.max(this.begin, this.end + i);
}
indexRange(i = 0, I = this.length) {
var i = i >= 0 ? Math.min(this.begin + i, this.end) : Math.max(this.begin, this.end + i);
var I = I >= 0 ? Math.min(this.begin + I, this.end) : Math.max(this.begin, this.end + I);
return [i, Math.max(i, I)];
}
get length() {
return this.end - this.begin;
}
get(i) {
if (i >= 0 && i < this.length)
return this.base[this.begin + i];
}
at(i) {
if (i >= -this.length && i < this.length)
return this.base[this.index(i)];
}
set(i, v) {
if (i >= 0 && i < this.length)
this.base[this.begin + i] = v;
}
sort(fc) {
var x = this.base.slice(this.begin, this.end);
x.sort(fc);
this.base.splice(this.begin, x.length, ...x);
}
slice(i = 0, I = this.length) {
return this.base.slice(this.begin, this.end).slice(i, I);
}
find(ft, ths) {
return this.base.slice(this.begin, this.end).find(ft, ths);
}
findIndex(ft, ths) {
return this.base.slice(this.begin, this.end).findIndex(ft, ths);
}
includes(v, i = 0) {
return this.base.slice(this.begin, this.end).includes(v, i);
}
indexOf(v, i = 0) {
return this.base.slice(this.begin, this.end).indexOf(v, i);
}
lastIndexOf(v, i = this.length - 1) {
return this.base.slice(this.begin, this.end).lastIndexOf(v, i);
}
forEach(fn, ths) {
this.base.slice(this.begin, this.end).forEach(fn, ths);
}
some(ft, ths) {
return this.base.slice(this.begin, this.end).some(ft, ths);
}
every(ft, ths) {
return this.base.slice(this.begin, this.end).every(ft, ths);
}
map(fm, ths) {
return this.base.slice(this.begin, this.end).map(fm, ths);
}
reduce(fr, init) {
return this.base.slice(this.begin, this.end).reduce(fr, init);
}
reduceRight(fr, init) {
return this.base.slice(this.begin, this.end).reduceRight(fr, init);
}
filter(ft, ths) {
return this.base.slice(this.begin, this.end).filter(ft, ths);
}
flat(d = 1) {
return this.base.slice(this.begin, this.end).flat(d);
}
flatMap(fm, ths) {
return this.base.slice(this.begin, this.end).flatMap(fm, ths);
}
fill(v, i = 0, I = this.length) {
var [i, I] = this.indexRange(i, I);
this.base.fill(v, i, I);
}
push(...vs) {
return this.length;
}
pop() {
return undefined;
}
shift() {
return undefined;
}
unshift(...vs) {
return this.length;
}
copyWithin(j, i, I = this.length) {
var x = this.base.slice(this.begin, this.end);
x.copyWithin(j, i, I);
this.base.splice(this.begin, x.length, ...x);
}
splice(i, n, ...vs) {
return [];
}
concat(...xs) {
return this.base.slice(this.begin, this.end).concat(...xs);
}
join(sep = ",") {
return this.base.slice(this.begin, this.end).join(sep);
}
reverse() {
var x = this.base.slice(this.begin, this.end);
x.reverse();
this.base.splice(this.begin, x.length, ...x);
}
toLocaleString() {
return this.base.slice(this.begin, this.end).toLocaleString();
}
toString() {
return this.base.slice(this.begin, this.end).toString();
}
}
function fromArray(x, i = 0, I = x.length) {
var y = new RawArrayView(x, i, I);
return new Proxy(x, {
get(_, k) {
if (typeof k === "symbol" || !isFinite(k))
return y[k];
return y.get(Number(k));
},
set(_, k, v) {
if (typeof k === "symbol" || !isFinite(k))
return false;
y.set(Number(k), v);
return true;
},
ownKeys(x) {
return Reflect.ownKeys(x);
}
});
}
export { fromArray as from, fromArray };