@hlang-org/runtime
Version:
A FBP-Inspired language for universal applications.
121 lines • 13.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Edge = exports.Vertex = void 0;
const _ = (k) => String(k.id);
class Graph {
constructor(directed) {
// digraph or undigraph
this.directed = typeof directed === 'undefined' || Boolean(directed);
// Map<Vertex>
this.vertices = new Map();
// Matrix<{src: Port, dest: Port}> Adjacency matrix
this.adjList = new Matrix();
// Matrix<boolean> Join matrix cache
this.connectedMatrix = new Matrix();
}
addVertex(v) {
const vk = _(v.data);
if (this.vertices.has(vk))
return;
this.vertices.set(vk, v);
this.adjList.setRow(vk);
}
addEdge(e) {
const { v1, v2, data } = e;
const v1k = _(v1.data);
const v2k = _(v2.data);
if (!this.vertices.has(v1k))
this.vertices.set(v1k, v1);
if (!this.vertices.has(v2k))
this.vertices.set(v2k, v2);
this.adjList.set(v1k, v2k, data);
if (!this.directed) {
this.adjList.set(v2k, v1k, data);
}
}
// digraph
hasDest(from, to, visited = new Set()) {
if (visited.has(from))
return false;
visited.add(from);
if (this.connectedMatrix.get(from, to))
return true;
if (!this.adjList.getRow(from))
return false;
if (this.adjList.get(from, to)) {
this.connectedMatrix.set(from, to, true);
return true;
}
for (const dest of this.adjList.cols(from)) {
if (this.connectedMatrix.get(dest, to)) {
this.connectedMatrix.set(from, to, true);
return true;
}
if (this.hasDest(dest, to, new Set([...visited])))
return true;
}
return false;
}
isCircled(prev, next) {
const pk = _(prev);
const nk = _(next);
if (pk === nk)
return true;
return this.hasDest(nk, pk);
}
}
exports.default = Graph;
class Vertex {
constructor(data) {
this.data = data;
this.visited = false;
}
}
exports.Vertex = Vertex;
class Edge {
constructor(v1, v2, data) {
this.data = data;
this.v1 = new Vertex(v1);
this.v2 = new Vertex(v2);
}
}
exports.Edge = Edge;
class Matrix {
constructor() {
this.matrix = new Map();
return this;
}
setRow(row) {
if (!this.matrix.has(row)) {
this.matrix.set(row, new Map());
}
return this.matrix.get(row);
}
getRow(row) {
if (!this.matrix.has(row))
return null;
return this.matrix.get(row);
}
set(row, col, v) {
this.setRow(row);
this.matrix.get(row).set(col, v);
}
get(row, col) {
if (!this.matrix.has(row))
return null;
return this.matrix.get(row).get(col);
}
cols(row) {
if (!this.matrix)
return [];
if (!this.matrix.has(row))
return [];
return Array.from(this.matrix.get(row).keys());
}
rows() {
if (!this.matrix)
return [];
return Array.from(this.matrix.keys());
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29yZS9ncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUV0QyxNQUFxQixLQUFLO0lBTXhCLFlBQVksUUFBaUI7UUFDM0IsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRSxjQUFjO1FBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzFCLG1EQUFtRDtRQUNuRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDNUIsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsU0FBUyxDQUFDLENBQVk7UUFDcEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUFFLE9BQU87UUFFbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXpCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBYTtRQUNuQixNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFM0IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2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QVc7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRXZDLE9BQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBSSxDQUFDLEdBQUc7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFckMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFNUIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfID0gKGspOiBzdHJpbmcgPT4gU3RyaW5nKGsuaWQpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHcmFwaDxULCBLPiB7XG4gIGRpcmVjdGVkOiBib29sZWFuO1xuICB2ZXJ0aWNlczogTWFwPHN0cmluZywgVmVydGV4PEs+PjtcbiAgYWRqTGlzdDogTWF0cml4PFQ+O1xuICBjb25uZWN0ZWRNYXRyaXg6IE1hdHJpeDxib29sZWFuPjtcblxuICBjb25zdHJ1Y3RvcihkaXJlY3RlZDogYm9vbGVhbikge1xuICAgIC8vIGRpZ3JhcGggb3IgdW5kaWdyYXBoXG4gICAgdGhpcy5kaXJlY3RlZCA9IHR5cGVvZiBkaXJlY3RlZCA9PT0gJ3VuZGVmaW5lZCcgfHwgQm9vbGVhbihkaXJlY3RlZCk7XG4gICAgLy8gTWFwPFZlcnRleD5cbiAgICB0aGlzLnZlcnRpY2VzID0gbmV3IE1hcCgpO1xuICAgIC8vIE1hdHJpeDx7c3JjOiBQb3J0LCBkZXN0OiBQb3J0fT4gQWRqYWNlbmN5IG1hdHJpeFxuICAgIHRoaXMuYWRqTGlzdCA9IG5ldyBNYXRyaXgoKTtcbiAgICAvLyBNYXRyaXg8Ym9vbGVhbj4gSm9pbiBtYXRyaXggY2FjaGVcbiAgICB0aGlzLmNvbm5lY3RlZE1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcbiAgfVxuXG4gIGFkZFZlcnRleCh2OiBWZXJ0ZXg8Sz4pIHtcbiAgICBjb25zdCB2ayA9IF8odi5kYXRhKTtcblxuICAgIGlmICh0aGlzLnZlcnRpY2VzLmhhcyh2aykpIHJldHVybjtcblxuICAgIHRoaXMudmVydGljZXMuc2V0KHZrLCB2KTtcblxuICAgIHRoaXMuYWRqTGlzdC5zZXRSb3codmspO1xuICB9XG5cbiAgYWRkRWRnZShlOiBFZGdlPFQsIEs+KSB7XG4gICAgY29uc3QgeyB2MSwgdjIsIGRhdGEgfSA9IGU7XG5cbiAgICBjb25zdCB2MWsgPSBfKHYxLmRhdGEpO1xuICAgIGNvbnN0IHYyayA9IF8odjIuZGF0YSk7XG5cbiAgICBpZiAoIXRoaXMudmVydGljZXMuaGFzKHYxaykpIHRoaXMudmVydGljZXMuc2V0KHYxaywgdjEpO1xuICAgIGlmICghdGhpcy52ZXJ0aWNlcy5oYXModjJrKSkgdGhpcy52ZXJ0aWNlcy5zZXQodjJrLCB2Mik7XG5cbiAgICB0aGlzLmFkakxpc3Quc2V0KHYxaywgdjJrLCBkYXRhKTtcblxuICAgIGlmICghdGhpcy5kaXJlY3RlZCkge1xuICAgICAgdGhpcy5hZGpMaXN0LnNldCh2MmssIHYxaywgZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZGlncmFwaFxuICBoYXNEZXN0KGZyb206IHN0cmluZywgdG86IHN0cmluZywgdmlzaXRlZDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCkpIHtcbiAgICBpZiAodmlzaXRlZC5oYXMoZnJvbSkpIHJldHVybiBmYWxzZTtcbiAgICB2aXNpdGVkLmFkZChmcm9tKTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZE1hdHJpeC5nZXQoZnJvbSwgdG8pKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuYWRqTGlzdC5nZXRSb3coZnJvbSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5hZGpMaXN0LmdldChmcm9tLCB0bykpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkTWF0cml4LnNldChmcm9tLCB0bywgdHJ1ZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkZXN0IG9mIHRoaXMuYWRqTGlzdC5jb2xzKGZyb20pKSB7XG4gICAgICBpZiAodGhpcy5jb25uZWN0ZWRNYXRyaXguZ2V0KGRlc3QsIHRvKSkge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZE1hdHJpeC5zZXQoZnJvbSwgdG8sIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmhhc0Rlc3QoZGVzdCwgdG8sIG5ldyBTZXQoWy4uLnZpc2l0ZWRdKSkpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlzQ2lyY2xlZChwcmV2OiBULCBuZXh0OiBUKSB7XG4gICAgY29uc3QgcGsgPSBfKHByZXYpO1xuICAgIGNvbnN0IG5rID0gXyhuZXh0KTtcbiAgICBpZiAocGsgPT09IG5rKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5oYXNEZXN0KG5rLCBwayk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZlcnRleDxUPiB7XG4gIGRhdGE6IFQ7XG4gIHZpc2l0ZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoZGF0YTogVCkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy52aXNpdGVkID0gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVkZ2U8VCwgSz4gIHtcbiAgZGF0YTogVDtcbiAgdjE6IFZlcnRleDxLPjtcbiAgdjI6IFZlcnRleDxLPjtcblxuICBjb25zdHJ1Y3Rvcih2MTogSywgdjI6IEssIGRhdGE6IFQpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMudjEgPSBuZXcgVmVydGV4PEs+KHYxKTtcbiAgICB0aGlzLnYyID0gbmV3IFZlcnRleDxLPih2Mik7XG4gIH1cbn1cblxuY2xhc3MgTWF0cml4PFQ+IHtcbiAgbWF0cml4OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUPj47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5tYXRyaXggPSBuZXcgTWFwKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFJvdyhyb3c6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5tYXRyaXguaGFzKHJvdykpIHtcbiAgICAgIHRoaXMubWF0cml4LnNldChyb3csIG5ldyBNYXAoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWF0cml4LmdldChyb3cpO1xuICB9XG5cbiAgZ2V0Um93KHJvdzogc3RyaW5nKTogTWFwPHN0cmluZywgVD4gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWF0cml4Lmhhcyhyb3cpKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB0aGlzLm1hdHJpeC5nZXQocm93KTtcbiAgfVxuXG4gIHNldChyb3c6IHN0cmluZywgY29sOiBzdHJpbmcsIHY6IFQpIHtcbiAgICB0aGlzLnNldFJvdyhyb3cpO1xuXG4gICAgKHRoaXMubWF0cml4LmdldChyb3cpIGFzIE1hcDxzdHJpbmcsIFQ+KS5zZXQoY29sLCB2KTtcbiAgfVxuXG4gIGdldChyb3c6IHN0cmluZywgY29sOiBzdHJpbmcpOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLm1hdHJpeC5oYXMocm93KSkgcmV0dXJuIG51bGw7XG5cbiAgICByZXR1cm4gKHRoaXMubWF0cml4LmdldChyb3cpIGFzIE1hcDxzdHJpbmcsIFQ+KS5nZXQoY29sKTtcbiAgfVxuXG4gIGNvbHMocm93KTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5tYXRyaXgpIHJldHVybiBbXTtcbiAgICBpZiAoIXRoaXMubWF0cml4Lmhhcyhyb3cpKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbSgodGhpcy5tYXRyaXguZ2V0KHJvdykgYXMgTWFwPHN0cmluZywgVD4pLmtleXMoKSk7XG4gIH1cblxuICByb3dzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMubWF0cml4KSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLm1hdHJpeC5rZXlzKCkpO1xuICB9XG59XG4iXX0=