@fraczak/k 6.1.2 → 6.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/nak.klib ADDED
@@ -0,0 +1 @@
1
+ {"format":"k-object","codes":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":{"code":"product","product":{},"def":"$C0={};"},"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"code":"union","union":{"zero":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c","succ":"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF"},"def":"$C0=<C0\"succ\",C1\"zero\">;$C1={};"}},"rels":{"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"def":{"op":"comp","comp":[{"op":"product","product":[],"patterns":[0,1]},{"op":"vid","vid":"zero","patterns":[1,2]}],"patterns":[0,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"(...)","fields":[]},{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"<...>","fields":["zero"]}],"parent":[]},"edges":[{},{},{"zero":[1]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":1}}},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"def":{"op":"comp","comp":[{"op":"product","product":[{"label":"if","exp":{"op":"div","div":"zero","patterns":[2,1]}},{"label":"then","exp":{"op":"identity","patterns":[2,2]}}],"patterns":[2,0]},{"op":"dot","dot":"then","patterns":[0,2]}],"patterns":[2,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["if","then"],"rule":"comp:chain"},{"pattern":"(...)","fields":[]},{"pattern":"<...>","fields":["zero"],"rule":"comp:chain."}],"parent":[]},"edges":[{"if":[1],"then":[2]},{},{"zero":[1]}],"codeId":{}}},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"def":{"op":"vid","vid":"succ","patterns":[0,1]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"(...)","fields":[]},{"pattern":"<...>","fields":["succ"]}],"parent":[]},"edges":[{},{"succ":[0]}],"codeId":{}}},"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[0,1]},{"op":"div","div":"succ","patterns":[1,1]}],"patterns":[0,1]}},{"label":"y","exp":{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[0,2]},{"op":"ref","ref":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","patterns":[2,2]}],"patterns":[0,2]}}],"patterns":[0,0]},{"op":"ref","ref":"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393","patterns":[0,2]}],"patterns":[0,2]},{"op":"dot","dot":"y","patterns":[0,2]}],"patterns":[0,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"ref:input add(add)"},{"pattern":"<...>","fields":["succ"],"rule":"ref:input add(add)."},{"pattern":"<...>","fields":["succ"],"rule":"ref:input add(add)."}],"parent":[]},"edges":[{"x":[1],"y":[2]},{"succ":[1]},{"succ":[2]}],"codeId":{}}},"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"union","union":[{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[1,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[1,3]},{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[1,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[1,3]}],"patterns":[1,3]},{"op":"ref","ref":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","patterns":[3,3]}],"patterns":[1,3]},{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[1,3]},{"op":"div","div":"succ","patterns":[3,3]}],"patterns":[1,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[1,3]}}],"patterns":[1,0]},{"op":"ref","ref":"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp","patterns":[0,3]}],"patterns":[1,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[1,3]}}],"patterns":[1,0]},{"op":"ref","ref":"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393","patterns":[0,3]}],"patterns":[1,3]}],"patterns":[1,3]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"ref:input mult(mult)"},{"pattern":"{...}","fields":["x","y"],"rule":"union:input"},{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"<...>","fields":["succ","zero"],"rule":"ref:input mult(add)."}],"parent":[]},"edges":[{"x":[3],"y":[3]},{"x":[3],"y":[3]},{},{"succ":[3],"zero":[2]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":2}}}},"relAlias":{"zero?":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","zero":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","succ":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","add":"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393","mult":"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp","__main__":"@227p5FPVzZxF4qFe77EaaQNFyMPU5xSbpHWz6vaEwmrN"},"compileStats":{"sccs":[{"members":["zero?"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["zero"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["succ"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["add"],"strategy":"fixed_point","iterations":2,"converged":true},{"members":["mult"],"strategy":"fixed_point","iterations":2,"converged":true},{"members":["__main__"],"strategy":"single_pass","iterations":1,"converged":true}],"sccCount":6},"meta":{"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"type":"code","origins":[{"source":"Examples/nat.k","name":"nat","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":1,"column":9},"end":{"line":1,"column":30}}]},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"zero?","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":3,"column":9},"end":{"line":3,"column":34}}]},"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"zero","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":2,"column":8},"end":{"line":2,"column":17}}]},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"succ","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":4,"column":8},"end":{"line":4,"column":14}}]},"@mKEAm5rV7BDCh244NfCQgYE8wbEqbQMN3dbbPqBPg393":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"add","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":5,"column":10},"end":{"line":8,"column":2}}]},"@2BBEqu8VuB2NPE89pNNCe9hPbmesi5JFSUQmGgnSRchp":{"type":"rel","origins":[{"source":"Examples/nat.k","name":"mult","compiledAt":"2026-05-29T01:54:22.928Z","start":{"line":9,"column":8},"end":{"line":12,"column":2}}]}},"main":null}
package/nak2.klib ADDED
@@ -0,0 +1 @@
1
+ {"format":"k-object","codes":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":{"code":"product","product":{},"def":"$C0={};"},"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"code":"union","union":{"succ":"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF","zero":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},"def":"$C0=<C0\"succ\",C1\"zero\">;$C1={};"}},"rels":{"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"def":{"op":"comp","comp":[{"op":"product","product":[],"patterns":[1,0]},{"op":"vid","vid":"zero","patterns":[0,2]}],"patterns":[1,2]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"(...)","fields":[],"rule":"comp:chain"},{"pattern":"<...>","fields":["zero"],"rule":"comp:chain"}],"parent":[]},"edges":[{},{},{"zero":[0]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":0}}},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"def":{"op":"comp","comp":[{"op":"product","product":[{"label":"if","exp":{"op":"div","div":"zero","patterns":[1,2]}},{"label":"then","exp":{"op":"identity","patterns":[1,1]}}],"patterns":[1,0]},{"op":"dot","dot":"then","patterns":[0,1]}],"patterns":[1,1]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["if","then"],"rule":"comp:chain"},{"pattern":"<...>","fields":["zero"],"rule":"comp:chain"},{"pattern":"(...)","fields":[],"rule":"comp:chain."}],"parent":[]},"edges":[{"if":[2],"then":[1]},{"zero":[2]},{}],"codeId":{}}},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"def":{"op":"vid","vid":"succ","patterns":[1,0]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"<...>","fields":["succ"],"rule":"comp:chain"},{"pattern":"(...)","fields":[],"rule":"comp:chain."}],"parent":[]},"edges":[{"succ":[1]},{}],"codeId":{}}},"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[0,1]},{"op":"div","div":"succ","patterns":[1,1]}],"patterns":[0,1]}},{"label":"y","exp":{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[0,1]},{"op":"ref","ref":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","patterns":[1,1]}],"patterns":[0,1]}}],"patterns":[0,0]},{"op":"ref","ref":"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65","patterns":[0,1]}],"patterns":[0,1]},{"op":"dot","dot":"y","patterns":[0,1]}],"patterns":[0,1]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"comp:chain"},{"pattern":"<...>","fields":["succ"],"rule":"ref:input mKEA(mKEA)."}],"parent":[]},"edges":[{"x":[1],"y":[1]},{"succ":[1]}],"codeId":{}}},"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8":{"def":{"op":"union","union":[{"op":"comp","comp":[{"op":"union","union":[{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[2,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[2,3]},{"op":"comp","comp":[{"op":"dot","dot":"y","patterns":[2,3]},{"op":"ref","ref":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","patterns":[3,3]}],"patterns":[2,3]}],"patterns":[2,3]},{"op":"ref","ref":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","patterns":[3,3]}],"patterns":[2,3]},{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"product","product":[{"label":"x","exp":{"op":"comp","comp":[{"op":"dot","dot":"x","patterns":[2,3]},{"op":"div","div":"succ","patterns":[3,3]}],"patterns":[2,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[2,3]}}],"patterns":[2,0]},{"op":"ref","ref":"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8","patterns":[0,3]}],"patterns":[2,3]}},{"label":"y","exp":{"op":"dot","dot":"y","patterns":[2,3]}}],"patterns":[2,0]},{"op":"ref","ref":"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65","patterns":[0,3]}],"patterns":[2,3]}],"patterns":[2,3]},"typeDerivation":{"status":"converged"},"typePatternGraph":{"patterns":{"nodes":[{"pattern":"{}","fields":["x","y"],"rule":"ref:input 2BBE(2BBE)"},{"pattern":"type","type":"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c"},{"pattern":"{...}","fields":["x","y"],"rule":"comp:chain"},{"pattern":"<...>","fields":["succ","zero"],"rule":"ref:input 2BBE(mKEA)."}],"parent":[]},"edges":[{"x":[3],"y":[3]},{},{"x":[3],"y":[3]},{"succ":[3],"zero":[1]}],"codeId":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":1}}}},"relAlias":{"nXXq":"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5","p5vX":"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM","Swjz":"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj","mKEA":"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65","2BBE":"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8","__main__":"@QfyLpmn56wuppuGvrrUJz8LKtgaXfbMtad7RnzBcFk2S"},"compileStats":{"sccs":[{"members":["nXXq"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["p5vX"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["Swjz"],"strategy":"single_pass","iterations":1,"converged":true},{"members":["mKEA"],"strategy":"fixed_point","iterations":1,"converged":true},{"members":["2BBE"],"strategy":"fixed_point","iterations":1,"converged":true},{"members":["__main__"],"strategy":"single_pass","iterations":1,"converged":true}],"sccCount":6},"meta":{"@NiDZqYggx3VZ6b8quBZKTfkgJztWctkesuX4CrhTxM5c":{"type":"code","origins":[{"source":"nat.k","name":"NiDZ","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":2,"column":10},"end":{"line":2,"column":12}}]},"@w8iSHeQQE738vEmWNGja3FQWk3XuExQKZ2pbm8ApEdkF":{"type":"code","origins":[{"source":"nat.k","name":"w8iS","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":3,"column":10},"end":{"line":3,"column":38}}]},"@nXXqMAi2PVsBzSN2KidWgg74hYhBbHQt5hw5TgPKvEy5":{"type":"rel","origins":[{"source":"nat.k","name":"nXXq","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":6,"column":8},"end":{"line":6,"column":71}}]},"@p5vX3t22gqMxGDRMngp7bGmHwhxZT5hXHFVb862a2kvM":{"type":"rel","origins":[{"source":"nat.k","name":"p5vX","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":5,"column":8},"end":{"line":5,"column":42}}]},"@SwjzXdcxv8ZbpCkF4cXGtgKkqPTfYqGGP5erQE7DCCsj":{"type":"rel","origins":[{"source":"nat.k","name":"Swjz","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":7,"column":15},"end":{"line":7,"column":20}}]},"@TJpAUPHR8Nch4PrWdXvg6D7qTtJ37vDvYdSkTvg6qX65":{"type":"rel","origins":[{"source":"nat.k","name":"mKEA","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":8,"column":52},"end":{"line":8,"column":86}}]},"@ELHmpgN5z5NNrDHPffcKRspqmivABSpjM4fbd25TyWw8":{"type":"rel","origins":[{"source":"nat.k","name":"2BBE","compiledAt":"2026-05-29T01:55:17.693Z","start":{"line":9,"column":54},"end":{"line":9,"column":119}}]}},"main":null}
package/nat.k ADDED
@@ -0,0 +1,10 @@
1
+ ----- codes -----
2
+ $ NiDZ = {};
3
+ $ w8iS = < w8iS "succ", NiDZ "zero" >;
4
+ ----- rels -----
5
+ p5vX = ?(...) {} |zero ?<$NiDZ zero, ...>;
6
+ nXXq = ?<(...) zero, ...> {/zero if, () then} .then ?<(...) zero, ...>;
7
+ Swjz = ?(...) |succ ?<(...) succ, ...>;
8
+ mKEA = ?{<X0 succ, ...>=X0 x, <X1 succ, ...>=X1 y} <{.x /succ x, .y Swjz y} mKEA, .y> ?<X0 succ, ...>=X0;
9
+ 2BBE = ?{<X0 succ, $NiDZ zero, ...>=X0 x, X0 y, ...} <<.x nXXq, .y nXXq> p5vX, {{.x /succ x, .y y} 2BBE x, .y y} mKEA> ?<X0 succ, $NiDZ zero, ...>=X0;
10
+ ()
package/nat2.k ADDED
@@ -0,0 +1,9 @@
1
+ ----- codes -----
2
+ $ NiDZ = {};
3
+ $ w8iS = < w8iS "succ", NiDZ "zero" >;
4
+ ----- rels -----
5
+ p5vX = ?(...) {} |zero ?<$NiDZ zero, ...>;
6
+ nXXq = ?<(...) zero, ...> {/zero if, () then} .then ?<(...) zero, ...>;
7
+ Swjz = ?(...) |succ ?<(...) succ, ...>;
8
+ TJpA = ?{<X0 succ, ...>=X0 x, X0 y} <{.x /succ x, .y Swjz y} TJpA, .y> ?<X0 succ, ...>=X0;
9
+ ELHm = ?{<X0 succ, $NiDZ zero, ...>=X0 x, X0 y, ...} <<.x nXXq, .y nXXq> p5vX, {{.x /succ x, .y y} ELHm x, .y y} TJpA> ?<X0 succ, $NiDZ zero, ...>=X0;
package/object.mjs CHANGED
@@ -702,21 +702,29 @@ function codeToSource(code, aliases) {
702
702
  return code.code === "product" ? `{${body}}` : `< ${body} >`;
703
703
  }
704
704
 
705
- function boundaryFilterSource(typePatternGraph, patternId, aliases) {
706
- const [filter] = patterns2filters(typePatternGraph, patternId);
707
- return prettyRel({ op: "filter", filter: rewriteCodesInFilter(filter, aliases) });
705
+ function boundaryFilterSources(typePatternGraph, patternIds, aliases) {
706
+ return patterns2filters(typePatternGraph, ...patternIds)
707
+ .map((filter) => prettyRel({
708
+ op: "filter",
709
+ filter: rewriteCodesInFilter(filter, aliases)
710
+ }));
708
711
  }
709
712
 
710
713
  function prettyRelation(rel, aliases = {}, relAliases = {}) {
714
+ const [inputFilter, outputFilter] = boundaryFilterSources(
715
+ rel.typePatternGraph,
716
+ [rel.def.patterns[0], rel.def.patterns[1]],
717
+ aliases
718
+ );
711
719
  const body = rewriteRefsInExp(
712
720
  stripRelationBoundaryFilters(stripDebugFieldsFromExp(rel.def), rel.typePatternGraph),
713
721
  aliases,
714
722
  relAliases
715
723
  );
716
724
  return [
717
- boundaryFilterSource(rel.typePatternGraph, rel.def.patterns[0], aliases),
725
+ inputFilter,
718
726
  prettyRel(body),
719
- boundaryFilterSource(rel.typePatternGraph, rel.def.patterns[1], aliases)
727
+ outputFilter
720
728
  ].join(" ");
721
729
  }
722
730
 
@@ -768,10 +776,15 @@ function decompileObject(object) {
768
776
 
769
777
  const mainRel = relAliases[hydrated.main] || hydrated.main;
770
778
  const mainRelDef = rels[hydrated.main];
779
+ const [mainInputFilter, mainOutputFilter] = boundaryFilterSources(
780
+ mainRelDef.typePatternGraph,
781
+ [mainRelDef.def.patterns[0], mainRelDef.def.patterns[1]],
782
+ aliases
783
+ );
771
784
  const main = [
772
- boundaryFilterSource(mainRelDef.typePatternGraph, mainRelDef.def.patterns[0], aliases),
785
+ mainInputFilter,
773
786
  aliases[mainRel] || mainRel,
774
- boundaryFilterSource(mainRelDef.typePatternGraph, mainRelDef.def.patterns[1], aliases)
787
+ mainOutputFilter
775
788
  ].join(" ");
776
789
 
777
790
  return [
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@fraczak/k",
3
- "version": "6.1.2",
3
+ "version": "6.1.3",
4
4
  "description": "k — a language for composing first-order partial functions over algebraic data types (products and tagged unions); includes runtime, type derivation, REPL, and codec toolchain",
5
5
  "main": "index.mjs",
6
6
  "scripts": {
7
7
  "prepare": "jiwson -m es6 parser.jison -o parser.mjs; jiwson -m es6 valueParser.jison -o valueParser.mjs; ",
8
8
  "test": "node test.mjs; for f in Code-derivation-tests/*.mjs; do echo $f; node $f; done; node test-fingerprint.mjs; node test-hash-fuzz.mjs; node test-hash-normalization.mjs; node test-k-object.mjs; node test-repl.mjs; node test-ieee-arithmetic.mjs; ./tests.sh",
9
+ "perf:idempotency": "node scripts/benchmark-idempotency.mjs",
9
10
  "deps:graph": "node scripts/generate-dependency-graph.mjs"
10
11
  },
11
12
  "repository": {
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { mkdtempSync, statSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ import { performance } from "node:perf_hooks";
8
+
9
+ const DEFAULT_EXAMPLES = [
10
+ "Examples/nat.k",
11
+ "Examples/byte.k",
12
+ "Examples/bnat.k",
13
+ "Examples/arithmetics.k",
14
+ "Examples/ieee.k"
15
+ ];
16
+
17
+ const iterations = Number(process.env.K_BENCH_ITERATIONS || 5);
18
+ const examples = process.argv.slice(2);
19
+ const benchmarkExamples = examples.length > 0 ? examples : DEFAULT_EXAMPLES;
20
+
21
+ function run(args) {
22
+ const result = spawnSync("node", args, {
23
+ cwd: process.cwd(),
24
+ encoding: "utf8",
25
+ stdio: ["ignore", "pipe", "pipe"]
26
+ });
27
+ if (result.status !== 0) {
28
+ throw new Error(`${args.join(" ")} failed\n${result.stderr || result.stdout}`);
29
+ }
30
+ }
31
+
32
+ function median(values) {
33
+ const sorted = [...values].sort((a, b) => a - b);
34
+ return sorted[Math.floor(sorted.length / 2)];
35
+ }
36
+
37
+ function formatMs(value) {
38
+ return `${Math.round(value)} ms`;
39
+ }
40
+
41
+ function formatBytes(value) {
42
+ if (value >= 1024 * 1024) return `${(value / (1024 * 1024)).toFixed(1)} MiB`;
43
+ if (value >= 1024) return `${Math.round(value / 1024)} KiB`;
44
+ return `${value} B`;
45
+ }
46
+
47
+ console.log(`compile-lib/decompile round-trip benchmark (${iterations} iterations)`);
48
+ console.log("example, median, min, max, object");
49
+
50
+ for (const example of benchmarkExamples) {
51
+ const times = [];
52
+ let size = 0;
53
+
54
+ for (let i = 0; i < iterations; i++) {
55
+ const out = mkdtempSync(join(tmpdir(), `k-idempotency-bench-${example.replaceAll("/", "_")}-`));
56
+ const t0 = performance.now();
57
+ run(["objects/compile-lib.mjs", example, join(out, "1.klib")]);
58
+ run(["objects/decompile.mjs", join(out, "1.klib"), join(out, "1.k")]);
59
+ run(["objects/compile-lib.mjs", join(out, "1.k"), join(out, "2.klib")]);
60
+ run(["objects/decompile.mjs", join(out, "2.klib"), join(out, "2.k")]);
61
+ times.push(performance.now() - t0);
62
+ size = statSync(join(out, "1.klib")).size;
63
+ }
64
+
65
+ console.log([
66
+ example,
67
+ formatMs(median(times)),
68
+ formatMs(Math.min(...times)),
69
+ formatMs(Math.max(...times)),
70
+ formatBytes(size)
71
+ ].join(", "));
72
+ }
package/test-k-object.mjs CHANGED
@@ -91,6 +91,25 @@ assert.match(decompiledSource, /\$ Nws3 =/);
91
91
  assert.match(decompiledSource, /^7jfi = /m);
92
92
  assert.match(decompiledSource, /^----- main -----\n\?\(\.\.\.\) 7jfi \$Nws3$/m);
93
93
 
94
+ const natLibraryBuffer = compileLibraryBuffer(fs.readFileSync("Examples/nat.k", "utf8"), { source: "Examples/nat.k" });
95
+ const natDecompiledSource = decompileObjectBuffer(natLibraryBuffer);
96
+ const natRoundTripSource = decompileObjectBuffer(
97
+ compileLibraryBuffer(natDecompiledSource, { source: "Examples/nat.decompiled.k" })
98
+ );
99
+ const recursiveNatPattern = /\?\{<X0 succ, \.\.\.>=X0 x, <X1 succ, \.\.\.>=X1 y\} .* \?X1;/;
100
+ assert.equal(natRoundTripSource, natDecompiledSource);
101
+ assert.match(natDecompiledSource, recursiveNatPattern);
102
+
103
+ const arithmeticsLibraryBuffer = compileLibraryBuffer(
104
+ fs.readFileSync("Examples/arithmetics.k", "utf8"),
105
+ { source: "Examples/arithmetics.k" }
106
+ );
107
+ const arithmeticsDecompiledSource = decompileObjectBuffer(arithmeticsLibraryBuffer);
108
+ const arithmeticsRoundTripSource = decompileObjectBuffer(
109
+ compileLibraryBuffer(arithmeticsDecompiledSource, { source: "Examples/arithmetics.decompiled.k" })
110
+ );
111
+ assert.equal(arithmeticsRoundTripSource, arithmeticsDecompiledSource);
112
+
94
113
  assert.throws(() => k.compile("@A = (); @A"), /Parse error/);
95
114
  assert.throws(() => k.compile("$ @A = {}; $@A"), /Parse error/);
96
115
  assert.deepEqual(k.compile("7jfi = ?X0; 7jfi")(new Product({})).toJSON(), {});