column-helpers.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import Column from './column'
  7. export function getArrayBounds(rowCount: number, params?: Column.ToArrayParams<any>) {
  8. const start = params && typeof params.start !== 'undefined' ? Math.max(Math.min(params.start, rowCount - 1), 0) : 0;
  9. const end = params && typeof params.end !== 'undefined' ? Math.min(params.end, rowCount) : rowCount;
  10. return { start, end };
  11. }
  12. export function createArray(rowCount: number, params?: Column.ToArrayParams<any>) {
  13. const c = params && typeof params.array !== 'undefined' ? params.array : Array;
  14. const { start, end } = getArrayBounds(rowCount, params);
  15. return { array: new c(end - start) as any[], start, end };
  16. }
  17. export function fillArrayValues(value: (row: number) => any, target: any[], start: number) {
  18. for (let i = 0, _e = target.length; i < _e; i++) target[i] = value(start + i);
  19. return target;
  20. }
  21. export function createAndFillArray(rowCount: number, value: (row: number) => any, params?: Column.ToArrayParams<any>) {
  22. const { array, start } = createArray(rowCount, params);
  23. return fillArrayValues(value, array, start);
  24. }
  25. export function isTypedArray(data: any): boolean {
  26. return !!data.buffer && typeof data.byteLength === 'number' && typeof data.BYTES_PER_ELEMENT === 'number';
  27. }
  28. export function typedArrayWindow(data: any, params?: Column.ToArrayParams<any>): ReadonlyArray<number> {
  29. const { constructor, buffer, length, byteOffset, BYTES_PER_ELEMENT } = data;
  30. const { start, end } = getArrayBounds(length, params);
  31. if (start === 0 && end === length) return data;
  32. return new constructor(buffer, byteOffset + BYTES_PER_ELEMENT * start, Math.min(length, end - start));
  33. }