First commit
This commit is contained in:
74
node_modules/restructure/src/LazyArray.js
generated
vendored
Normal file
74
node_modules/restructure/src/LazyArray.js
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
import {Array as ArrayT} from './Array.js';
|
||||
import {Number as NumberT} from './Number.js';
|
||||
import * as utils from './utils.js';
|
||||
|
||||
export class LazyArray extends ArrayT {
|
||||
decode(stream, parent) {
|
||||
const { pos } = stream;
|
||||
const length = utils.resolveLength(this.length, stream, parent);
|
||||
|
||||
if (this.length instanceof NumberT) {
|
||||
parent = {
|
||||
parent,
|
||||
_startOffset: pos,
|
||||
_currentOffset: 0,
|
||||
_length: length
|
||||
};
|
||||
}
|
||||
|
||||
const res = new LazyArrayValue(this.type, length, stream, parent);
|
||||
|
||||
stream.pos += length * this.type.size(null, parent);
|
||||
return res;
|
||||
}
|
||||
|
||||
size(val, ctx) {
|
||||
if (val instanceof LazyArrayValue) {
|
||||
val = val.toArray();
|
||||
}
|
||||
|
||||
return super.size(val, ctx);
|
||||
}
|
||||
|
||||
encode(stream, val, ctx) {
|
||||
if (val instanceof LazyArrayValue) {
|
||||
val = val.toArray();
|
||||
}
|
||||
|
||||
return super.encode(stream, val, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
class LazyArrayValue {
|
||||
constructor(type, length, stream, ctx) {
|
||||
this.type = type;
|
||||
this.length = length;
|
||||
this.stream = stream;
|
||||
this.ctx = ctx;
|
||||
this.base = this.stream.pos;
|
||||
this.items = [];
|
||||
}
|
||||
|
||||
get(index) {
|
||||
if ((index < 0) || (index >= this.length)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (this.items[index] == null) {
|
||||
const { pos } = this.stream;
|
||||
this.stream.pos = this.base + (this.type.size(null, this.ctx) * index);
|
||||
this.items[index] = this.type.decode(this.stream, this.ctx);
|
||||
this.stream.pos = pos;
|
||||
}
|
||||
|
||||
return this.items[index];
|
||||
}
|
||||
|
||||
toArray() {
|
||||
const result = [];
|
||||
for (let i = 0, end = this.length; i < end; i++) {
|
||||
result.push(this.get(i));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user