aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/chips2.js (renamed from lib/types.js)90
1 files changed, 86 insertions, 4 deletions
diff --git a/lib/types.js b/lib/chips2.js
index 3fbb1c9..2c4c786 100644
--- a/lib/types.js
+++ b/lib/chips2.js
@@ -49,7 +49,7 @@ function Type(TypeName,Params=[]) {
workspace += c;
}
if (workspace) types.push(workspace);
- this.template = types.map(t => t.trim()).map(t => Params.includes(t) ? Type.any : new Type(t, Params));
+ this.template = types.map(t => t.trim()).map(t => new Type(t, Params));
}
//Template
else if (/^[^<]+<.+>$/.test(TypeName)) {
@@ -79,7 +79,7 @@ function Type(TypeName,Params=[]) {
workspace += c;
}
if (workspace) types.push(workspace);
- this.template = types.map(t => t.trim()).map(t => Params.includes(t) ? Type.any : new Type(t, Params));
+ this.template = types.map(t => t.trim()).map(t => new Type(t, Params));
Type.all[this.typename] = () => new Type(TypeName, Array.from(Params));
}
//Standard Type, or Template Param
@@ -96,7 +96,7 @@ function Type(TypeName,Params=[]) {
}
}
-Type.prototype.toString = function() {
+Type.prototype.toString = function(info=false) {
switch (this.mode) {
case "tuple":
return `(${this.template.join(',')})`;
@@ -108,7 +108,7 @@ Type.prototype.toString = function() {
case "standard":
return this.typename;
case "param":
- return this.template.toString();
+ return info ? `${this.typename}: ${this.template}` : this.template.toString();
}
}
@@ -321,4 +321,86 @@ function Chip(Entry) {
input.append(...cur.Inputs.map(genPort).flat());
output.append(...cur.Outputs.map(genPort).flat());
+}
+
+
+//chips.js reimplemented with the above
+
+let root = document.documentElement;
+if (window.location.pathname != '/grapher/') {
+ root.addEventListener("mousemove", e => {
+ root.style.setProperty('--mouse-x', e.clientX + "px");
+ root.style.setProperty('--mouse-y', e.clientY + "px");
+ });
+}
+
+const portColors = {
+ float: '#186adc',
+ int: '#0f6522',
+ exec: '#f55b18',
+ string: '#794284',
+ bool: '#ea2e50',
+ any: '#f6eee8',
+ special: '#f4c61e'
+}
+const typeRegex = /(?:^|(?<=<))(?:int|float|bool|string|exec)(?:$|(?=>))/;
+const unionRegex = /^T\d*$|(?<=List<)T\d*(?=>)/;
+
+function computeType(tn, TypeParams, to) {
+ if (tn != "exec") {
+ const t = Object.entries({...TypeParams, ...to}).reduce((t,i) => t.resolve(...i), new Type(tn, Object.keys(TypeParams)));
+ return {typeclass: t.getClasses(), type: t.toString()};
+ } else {
+ return {typeclass: ['exec'], type: 'exec'};
+ }
+}
+
+//keeping this the same for now
+function generateChipHTML(NodeDescs, typeoverride = undefined) {
+ for (let cur of NodeDescs) {
+ let ins = cur.Inputs;
+ let outs = cur.Outputs;
+
+ const root = newEl('div', 'chip');
+ const header = newEl('div', 'chipheader');
+ header.innerText = cur.Name;
+ const input = newEl('div', 'input');
+ const output = newEl('div', 'output');
+ root.append(header, input, output);
+
+ for (const inp of ins) {
+ //work out the type
+ let {typeclass, type} = computeType(inp.ReadonlyType, cur.ReadonlyTypeParams, typeoverride);
+
+ const port = newEl('div', '');
+ port.innerHTML = inp.Name + "&nbsp;";
+ typeclass.map(port.classList.add.bind(port.classList));
+
+ const tooltip = newEl('div', 'type');
+ tooltip.innerText = type;
+
+ input.append(port, tooltip);
+ }
+
+ for (const out of outs) {
+ //work out the type
+ let {typeclass, type} = computeType(out.ReadonlyType, cur.ReadonlyTypeParams, typeoverride);
+
+ const port = newEl('div', '');
+ port.innerHTML = out.Name + "&nbsp;";
+ typeclass.map(port.classList.add.bind(port.classList));
+
+ const tooltip = newEl('div', 'type');
+ tooltip.innerText = type;
+
+ output.append(port, tooltip);
+ }
+
+ return root;
+ }
+
+}
+
+function ListAllTypes(Nodes) {
+ return Object.keys(Type.all);
} \ No newline at end of file