molstar
Version:
A comprehensive macromolecular library.
299 lines • 10.9 kB
JavaScript
/**
* Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
import { __assign } from "tslib";
import { Column } from './column';
import { sortArray } from '../util/sort';
import { StringBuilder } from '../../mol-util';
/** An immutable table */
var Table;
(function (Table) {
function is(t) {
return t && typeof t._rowCount === 'number' && !!t._columns && !!t._schema;
}
Table.is = is;
function pickColumns(schema, table, guard) {
if (guard === void 0) { guard = {}; }
var ret = Object.create(null);
var keys = Object.keys(schema);
ret._rowCount = table._rowCount;
ret._columns = keys;
ret._schema = schema;
for (var _a = 0, keys_1 = keys; _a < keys_1.length; _a++) {
var k = keys_1[_a];
if (!!table[k])
ret[k] = table[k];
else if (!!guard[k])
ret[k] = guard[k];
else
throw Error("Cannot find column '" + k + "'.");
}
return ret;
}
Table.pickColumns = pickColumns;
function ofColumns(schema, columns) {
var _columns = Object.keys(columns);
var _rowCount = columns[_columns[0]].rowCount;
return __assign({ _rowCount: _rowCount, _columns: _columns, _schema: schema }, columns);
}
Table.ofColumns = ofColumns;
function ofPartialColumns(schema, partialColumns, rowCount) {
var ret = Object.create(null);
var columns = Object.keys(schema);
ret._rowCount = rowCount;
ret._columns = columns;
ret._schema = schema;
for (var _a = 0, columns_1 = columns; _a < columns_1.length; _a++) {
var k = columns_1[_a];
if (k in partialColumns)
ret[k] = partialColumns[k];
else
ret[k] = Column.Undefined(rowCount, schema[k]);
}
return ret;
}
Table.ofPartialColumns = ofPartialColumns;
function ofUndefinedColumns(schema, rowCount) {
var ret = Object.create(null);
var columns = Object.keys(schema);
ret._rowCount = rowCount;
ret._columns = columns;
ret._schema = schema;
for (var _a = 0, columns_2 = columns; _a < columns_2.length; _a++) {
var k = columns_2[_a];
ret[k] = Column.Undefined(rowCount, schema[k]);
}
return ret;
}
Table.ofUndefinedColumns = ofUndefinedColumns;
function ofRows(schema, rows) {
var ret = Object.create(null);
var rowCount = rows.length;
var columns = Object.keys(schema);
ret._rowCount = rowCount;
ret._columns = columns;
ret._schema = schema;
var _loop_1 = function (k) {
ret[k] = Column.ofLambda({
rowCount: rowCount,
schema: schema[k],
value: function (r) { return rows[r][k]; },
valueKind: function (r) { return typeof rows[r][k] === 'undefined' ? 1 /* NotPresent */ : 0 /* Present */; }
});
};
for (var _a = 0, columns_3 = columns; _a < columns_3.length; _a++) {
var k = columns_3[_a];
_loop_1(k);
}
return ret;
}
Table.ofRows = ofRows;
function ofArrays(schema, arrays) {
var _a;
var ret = Object.create(null);
var columns = Object.keys(schema);
ret._rowCount = 0;
ret._columns = columns;
ret._schema = schema;
for (var _b = 0, columns_4 = columns; _b < columns_4.length; _b++) {
var k = columns_4[_b];
if (typeof arrays[k] !== 'undefined') {
ret[k] = Column.ofArray({ array: arrays[k], schema: schema[k] });
ret._rowCount = (_a = arrays[k]) === null || _a === void 0 ? void 0 : _a.length;
}
else {
ret[k] = Column.Undefined(ret._rowCount, schema[k]);
}
}
return ret;
}
Table.ofArrays = ofArrays;
function view(table, schema, view) {
var ret = Object.create(null);
var columns = Object.keys(schema);
ret._rowCount = view.length;
ret._columns = columns;
ret._schema = schema;
for (var _a = 0, columns_5 = columns; _a < columns_5.length; _a++) {
var k = columns_5[_a];
ret[k] = Column.view(table[k], view);
}
return ret;
}
Table.view = view;
function pick(table, schema, test) {
var _view = [];
for (var i = 0, il = table._rowCount; i < il; ++i) {
if (test(i))
_view.push(i);
}
return view(table, schema, _view);
}
Table.pick = pick;
function window(table, schema, start, end) {
if (start === 0 && end === table._rowCount)
return table;
var ret = Object.create(null);
var columns = Object.keys(schema);
ret._rowCount = end - start;
ret._columns = columns;
ret._schema = schema;
for (var _a = 0, columns_6 = columns; _a < columns_6.length; _a++) {
var k = columns_6[_a];
ret[k] = Column.window(table[k], start, end);
}
return ret;
}
Table.window = window;
function concat(tables, schema) {
var ret = Object.create(null);
var columns = Object.keys(schema);
ret._rowCount = 0;
for (var _a = 0, tables_1 = tables; _a < tables_1.length; _a++) {
var table = tables_1[_a];
ret._rowCount += table._rowCount;
}
var arrays = {};
for (var _b = 0, columns_7 = columns; _b < columns_7.length; _b++) {
var column = columns_7[_b];
arrays[column] = new Array(ret._rowCount);
}
ret._columns = columns;
ret._schema = schema;
var offset = 0;
for (var _c = 0, tables_2 = tables; _c < tables_2.length; _c++) {
var table = tables_2[_c];
for (var _d = 0, columns_8 = columns; _d < columns_8.length; _d++) {
var k = columns_8[_d];
Column.copyToArray(table[k], arrays[k], offset);
}
offset += table._rowCount;
}
for (var _e = 0, columns_9 = columns; _e < columns_9.length; _e++) {
var k = columns_9[_e];
ret[k] = Column.ofArray({ array: arrays[k], schema: schema[k] });
}
return ret;
}
Table.concat = concat;
function columnToArray(table, name, array) {
table[name] = Column.asArrayColumn(table[name], array);
}
Table.columnToArray = columnToArray;
/** Sort and return a new table */
function sort(table, cmp) {
var indices = new Int32Array(table._rowCount);
for (var i = 0, _i = indices.length; i < _i; i++)
indices[i] = i;
sortArray(indices, function (_, i, j) { return cmp(i, j); });
var isIdentity = true;
for (var i = 0, _i = indices.length; i < _i; i++) {
if (indices[i] !== i) {
isIdentity = false;
break;
}
}
if (isIdentity)
return table;
var ret = Object.create(null);
ret._rowCount = table._rowCount;
ret._columns = table._columns;
ret._schema = table._schema;
for (var _a = 0, _b = table._columns; _a < _b.length; _a++) {
var c = _b[_a];
ret[c] = Column.view(table[c], indices, false);
}
return ret;
}
Table.sort = sort;
function areEqual(a, b) {
if (a._rowCount !== b._rowCount)
return false;
if (a._columns.length !== b._columns.length)
return false;
for (var _a = 0, _b = a._columns; _a < _b.length; _a++) {
var c = _b[_a];
if (!b[c])
return false;
}
for (var _c = 0, _d = a._columns; _c < _d.length; _c++) {
var c = _d[_c];
if (!Column.areEqual(a[c], b[c]))
return false;
}
return true;
}
Table.areEqual = areEqual;
/** Allocate a new object with the given row values. */
function getRow(table, index) {
var row = Object.create(null);
var cols = table._columns;
for (var i = 0; i < cols.length; i++) {
var c = cols[i];
row[c] = table[c].value(index);
}
return row;
}
Table.getRow = getRow;
/** Pick the first row for which `test` evaluates to true */
function pickRow(table, test) {
for (var i = 0, il = table._rowCount; i < il; ++i) {
if (test(i))
return getRow(table, i);
}
}
Table.pickRow = pickRow;
function getRows(table) {
var ret = [];
var c = table._rowCount;
for (var i = 0; i < c; i++) {
ret[i] = getRow(table, i);
}
return ret;
}
Table.getRows = getRows;
function toArrays(table) {
var arrays = {};
var _columns = table._columns;
for (var i = 0; i < _columns.length; i++) {
var c = _columns[i];
arrays[c] = table[c].toArray();
}
return arrays;
}
Table.toArrays = toArrays;
function formatToString(table) {
var sb = StringBuilder.create();
var cols = table._columns, _rowCount = table._rowCount;
var headerLength = 1;
StringBuilder.write(sb, '|');
for (var i = 0; i < cols.length; i++) {
StringBuilder.write(sb, cols[i]);
StringBuilder.write(sb, '|');
headerLength += cols[i].length + 1;
}
StringBuilder.newline(sb);
StringBuilder.write(sb, new Array(headerLength + 1).join('-'));
StringBuilder.newline(sb);
for (var r = 0; r < _rowCount; r++) {
StringBuilder.write(sb, '|');
for (var i = 0; i < cols.length; i++) {
var c = table[cols[i]];
if (c.valueKind(r) === 0 /* Present */) {
StringBuilder.write(sb, c.value(r));
StringBuilder.write(sb, '|');
}
else {
StringBuilder.write(sb, '.|');
}
}
StringBuilder.newline(sb);
}
return StringBuilder.getString(sb);
}
Table.formatToString = formatToString;
})(Table || (Table = {}));
export { Table };
//# sourceMappingURL=table.js.map