diff --git a/src/arr/trove/tables.arr b/src/arr/trove/tables.arr index 79fda3788..656c465b3 100644 --- a/src/arr/trove/tables.arr +++ b/src/arr/trove/tables.arr @@ -6,6 +6,7 @@ end import global as G include from G: raw-array-duplicate end include lists +import table as T type Reducer = { one :: (InVal -> {Acc; OutVal}), @@ -92,7 +93,7 @@ fun is-raw-array-of-rows(ra :: RawArray) -> Boolean: raw-array-fold(lam(base, elt, _): base and is-row(elt) end, true, ra, 0) end -fun table-from-raw-array(arr :: RawArray%(is-raw-array-of-rows)) -> Table: +fun table-from-raw-array(arr :: T.RawArrayOfRows) -> Table: col-names = raw-array-get(arr, 0).get-column-names() with-cols = empty-table(col-names) for raw-array-fold(t from with-cols, r from arr, _ from 0): diff --git a/src/js/base/post-load-hooks.js b/src/js/base/post-load-hooks.js index 60743484e..74c7d5a63 100644 --- a/src/js/base/post-load-hooks.js +++ b/src/js/base/post-load-hooks.js @@ -22,7 +22,7 @@ define("pyret-base/js/post-load-hooks", function() { runtime["checkEQ"] = runtime.makeCheckType(ffi.isEqualityResult, "EqualityResult"); }, "builtin://table": function(table) { - table = table.jsmod; + table = runtime.getField(runtime.getField(table, "provide-plus-types"), "internal"); runtime["makeTable"] = table.makeTable; runtime["makeRow"] = table.makeRow; runtime["makeRowFromArray"] = table.makeRowFromArray; diff --git a/src/js/trove/reactors.js b/src/js/trove/reactors.js index 2baca3ca3..e60d33aa7 100644 --- a/src/js/trove/reactors.js +++ b/src/js/trove/reactors.js @@ -219,7 +219,9 @@ i += 1; return ans; }); - return tables.makeTable(["tick", "state"], rows); + console.log('tables =', tables); + return gf(tables, "internal").makeTable(["tick", "state"], rows); + // return runtime.makeTable(["tick", "state"], rows); } else { runtime.ffi.throwMessageException("Tried to get trace of a reactor that isn't tracing; try calling start-trace() first"); diff --git a/src/js/trove/table.js b/src/js/trove/table.js index 4779dc152..6966f6813 100644 --- a/src/js/trove/table.js +++ b/src/js/trove/table.js @@ -7,7 +7,11 @@ nativeRequires: [ "pyret-base/js/type-util" ], - provides: {}, + provides: { + types: { + 'RawArrayOfRows': 'tany' + } + }, theModule: function(runtime, namespace, uri, VSlib, EQlib, ffi, t) { var get = runtime.getField; @@ -23,6 +27,20 @@ var brandRow = runtime.namedBrander("row", ["table: row brander"]); var annRow = runtime.makeBranderAnn(brandRow, "Row"); + var ann = function(name, pred) { + return runtime.makePrimitiveAnn(name, pred); + }; + + function isRawArrayOfRows(raor) { + if (!Array.isArray(raor)) return false; + for (let i = 0; i < raor.length; i++) { + if (!runtime.hasBrand(raor[i], brandRow._brand)) return false; + } + return true; + } + + var annRawArrayOfRows = ann("RawArrayOfRows", isRawArrayOfRows); + var rowGetValue = runtime.makeMethod1(function(self, arg) { ffi.checkArity(2, arguments, "get-value", true); runtime.checkArgsInternal2("tables", "get-value", @@ -820,16 +838,20 @@ })); } - return runtime.makeJSModuleReturn({ - TableAnn : annTable, - RowAnn : annRow, + var internal = { makeTable: makeTable, makeRow: makeRow, makeRowFromArray: makeRowFromArray, openTable: openTable, isTable: isTable, isRow: isRow - }, - {}); + }; + var types = { + Table: annTable, + Row: annRow, + RawArrayOfRows: annRawArrayOfRows + }; + var values = {}; + return runtime.makeModuleReturn(values, types, internal); } }) diff --git a/tests/pyret/tests/test-tables.arr b/tests/pyret/tests/test-tables.arr index 65dcd391c..48e7d3710 100644 --- a/tests/pyret/tests/test-tables.arr +++ b/tests/pyret/tests/test-tables.arr @@ -692,13 +692,13 @@ check "table-from-rows": [list: [raw-row: {"A"; 5}, {"B"; 7}, {"C"; 8}], [raw-row: {"A"; 1}, {"B"; 2}, {"C"; 3}]]] - raises "is-raw-array-of-rows" + raises "RawArrayOfRows" [table-from-rows: 1, [raw-row: {"A"; 1}, {"B"; 2}], false, [raw-row: {"A"; 3}, {"B"; 4}], "non-row string", [raw-row: {"A"; 5}, {"B"; 6}]] - raises "is-raw-array-of-rows" + raises "RawArrayOfRows" [table-from-rows: [raw-row: 5, {"B"; 7}, {"C"; 8}],