column.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (c) 2017 molio contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. export type ColumnType = typeof ColumnType.str | typeof ColumnType.pooledStr | typeof ColumnType.int | typeof ColumnType.float
  7. export namespace ColumnType {
  8. export const str = { '@type': '' as string, kind: 'str' as 'str' };
  9. export const pooledStr = { '@type': '' as string, kind: 'pooled-str' as 'pooled-str' };
  10. export const int = { '@type': 0 as number, kind: 'int' as 'int' };
  11. export const float = { '@type': 0 as number, kind: 'float' as 'float' };
  12. }
  13. export interface ToArrayParams {
  14. array?: { new(size: number): ArrayLike<number> },
  15. /** First row */
  16. start?: number,
  17. /** Last row (exclusive) */
  18. end?: number
  19. }
  20. export interface Column<T> {
  21. readonly isDefined: boolean,
  22. readonly rowCount: number,
  23. value(row: number): T,
  24. isValueDefined(row: number): boolean,
  25. toArray(params?: ToArrayParams): ReadonlyArray<T>,
  26. stringEquals(row: number, value: string): boolean,
  27. areValuesEqual(rowA: number, rowB: number): boolean
  28. }
  29. export function UndefinedColumn<T extends ColumnType>(rowCount: number, type: T): Column<T['@type']> {
  30. const value: Column<T['@type']>['value'] = type.kind === 'str' ? row => '' : row => 0;
  31. return {
  32. isDefined: false,
  33. rowCount,
  34. value,
  35. isValueDefined(row) { return false; },
  36. toArray(params) {
  37. const { array } = createArray(rowCount, params);
  38. for (let i = 0, _i = array.length; i < _i; i++) array[i] = value(0)
  39. return array;
  40. },
  41. stringEquals(row, value) { return !value; },
  42. areValuesEqual(rowA, rowB) { return true; }
  43. }
  44. }
  45. /** A helped function for Column.toArray */
  46. export function createArray(rowCount: number, params?: ToArrayParams) {
  47. const { array, start, end } = params || ({} as ToArrayParams);
  48. const c = typeof array !== 'undefined' ? array : Array;
  49. const s = typeof start !== 'undefined' ? Math.max(Math.min(start, rowCount - 1), 0) : 0;
  50. const e = typeof end !== 'undefined' ? Math.min(end, rowCount) : rowCount;
  51. return { array: new c(e - s) as any[], start: s, end: e };
  52. }
  53. /** A helped function for Column.toArray */
  54. export function fillArrayValues(value: (row: number) => any, target: any[], start: number) {
  55. for (let i = 0, _e = target.length; i < _e; i++) target[i] = value(start + i);
  56. return target;
  57. }
  58. /** A helped function for Column.toArray */
  59. export function createAndFillArray(rowCount: number, value: (row: number) => any, params?: ToArrayParams) {
  60. const { array, start } = createArray(rowCount, params);
  61. return fillArrayValues(value, array, start);
  62. }