field.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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, ColumnHelpers } from 'mol-data/db'
  7. import * as Data from '../data-model'
  8. import { EncodedColumn, decode } from '../../../common/binary-cif'
  9. import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../../common/text/number-parser'
  10. export default function Field(column: EncodedColumn): Data.Field {
  11. const mask = column.mask ? decode(column.mask) as number[] : void 0;
  12. const data = decode(column.data);
  13. const isNumeric = ColumnHelpers.isTypedArray(data);
  14. const str: Data.Field['str'] = isNumeric
  15. ? mask
  16. ? row => mask[row] === Column.ValueKind.Present ? '' + data[row] : ''
  17. : row => '' + data[row]
  18. : mask
  19. ? row => mask[row] === Column.ValueKind.Present ? data[row] : ''
  20. : row => data[row];
  21. const int: Data.Field['int'] = isNumeric
  22. ? row => data[row]
  23. : row => { const v = data[row]; return fastParseInt(v, 0, v.length); };
  24. const float: Data.Field['float'] = isNumeric
  25. ? row => data[row]
  26. : row => { const v = data[row]; return fastParseFloat(v, 0, v.length); };
  27. const valueKind: Data.Field['valueKind'] = mask
  28. ? row => mask[row]
  29. : row => Column.ValueKind.Present;
  30. const rowCount = data.length;
  31. return {
  32. '@array': data,
  33. isDefined: true,
  34. rowCount,
  35. str,
  36. int,
  37. float,
  38. valueKind,
  39. areValuesEqual: (rowA, rowB) => data[rowA] === data[rowB],
  40. toStringArray: params => ColumnHelpers.createAndFillArray(rowCount, str, params),
  41. toIntArray: isNumeric
  42. ? params => ColumnHelpers.typedArrayWindow(data, params)
  43. : params => ColumnHelpers.createAndFillArray(rowCount, int, params),
  44. toFloatArray: isNumeric
  45. ? params => ColumnHelpers.typedArrayWindow(data, params)
  46. : params => ColumnHelpers.createAndFillArray(rowCount, float, params)
  47. };
  48. }