Skip to content
Snippets Groups Projects
Select Git revision
  • a8f59c86b7bbbcf4ce6184925cd07cd30ce0d005
  • main default protected
  • solution
3 results

view.js

Blame
  • view.js 1.24 KiB
    export class View {
      constructor(sequence, low, high) {
        const substrate = Array(high - low);
        if (sequence instanceof View) {
          substrate.original = sequence.original;
          substrate.low = sequence.low + low;
          substrate.high = sequence.low + high;
        } else {
          substrate.original = sequence;
          substrate.low = low;
          substrate.high = high;
        }
        const toOriginalIndex = (property) => {
          if (typeof property === 'string' && /^\d+$/.test(property)) {
            const result = substrate.low + Number(property);
            if (result < substrate.high) {
              return result;
            }
          }
          return undefined;
        };
        return new Proxy(substrate, {
          get(target, property, receiver) {
            const originalIndex = toOriginalIndex(property);
            if (originalIndex !== undefined) {
              return target.original[originalIndex];
            }
            return Reflect.get(target, property, receiver);
          },
          set(target, property, value, receiver) {
            const originalIndex = toOriginalIndex(property);
            if (originalIndex !== undefined) {
              target.original[originalIndex] = value;
              return true;
            }
            return Reflect.set(target, property, value, receiver);
          },
        });
      }
    }