@effectful/transducers-loose
Version:
@effectful/transducers built with faster generators
434 lines (433 loc) • 13.3 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _core = require("../core");
var Kit = require("../kit");
var T = require("@babel/types");
var M = require("@effectful/es-rt/opts/loose");
const SpecVars = (0, _core.symbol)("SpecVars", "ctrl");
const specNames = {
arguments: true
};
var _default = exports.default = Kit.pipe(Kit.wrap("eager-generators-transform", function transform(s) {
var make = function _make(i) {
var lab,
specVars,
make = M.generator(),
r,
p;
make.step = make_1;
make.$step = 3;
return make;
function make_1(p) {
var a;
switch (make.$cur = make.$step) {
case 3:
i.value.node.generator = false;
lab = s.label();
a = s.peelTo(_core.Tag.body);
make.$step = 4;
return make.$delegate(a);
case 4:
a = s.peelTo(_core.Tag.body);
make.$step = 5;
return make.$delegate(a);
case 5:
specVars = {};
a = s.tok(_core.Tag.push, SpecVars, {
node: specVars
});
make.$step = 6;
make.value = a;
return make;
case 6:
a = s.enter(_core.Tag.push, _core.Tag.ReturnStatement);
make.$step = 7;
make.value = a;
return make;
case 7:
a = s.enter(_core.Tag.argument, _core.Tag.CallExpression);
make.$step = 8;
make.value = a;
return make;
case 8:
a = s.tok(_core.Tag.callee, T.identifier("e$y$make"));
make.$step = 9;
make.value = a;
return make;
case 9:
a = s.enter(_core.Tag.arguments, _core.Tag.Array);
make.$step = 10;
make.value = a;
return make;
case 10:
a = s.enter(_core.Tag.push, _core.Tag.ArrowFunctionExpression, {
node: {
id: {
type: "Identifier",
name: i.value.node.id != null ? `${i.value.node.id.name}Impl` : "EagerGen"
},
params: [{
type: "Identifier",
name: "e$y$buf"
}]
}
});
make.$step = 11;
make.value = a;
return make;
case 11:
a = s.enter(_core.Tag.body, _core.Tag.BlockStatement);
make.$step = 12;
make.value = a;
return make;
case 12:
a = s.enter(_core.Tag.body, _core.Tag.Array);
make.$step = 13;
make.value = a;
return make;
case 13:
a = walk(specVars);
make.$step = 14;
return make.$delegate(a);
case 14:
a = lab();
make.$step = 15;
return make.$delegate(a);
case 15:
make.$step = 0;
make.value = void 0;
make.done = true;
return make;
case 0:
make.$step = 0;
make.value = p;
make.done = true;
return make;
case 1:
make.$step = 0;
throw p;
case 2:
return make.$redir(p);
default:
throw new Error("invalid state");
}
}
},
walk = function walk1(specVars) {
var i,
lab,
_walk = M.generator(),
loop,
r,
p;
_walk.step = walk_1;
_walk.$step = 3;
return _walk;
function walk_1(p) {
var a, b;
for (;;) {
switch (_walk.$cur = _walk.$step) {
case 3:
loop = M.iterator(s.sub());
_walk.$step = 4;
_walk.$step = 4;
continue;
case 4:
if (!(loop = loop.step()).done) {
i = loop.value;
switch (i.type) {
case _core.Tag.YieldExpression:
if (i.enter) {
lab = s.label();
a = s.enter(i.pos, _core.Tag.CallExpression);
_walk.$step = 5;
_walk.value = a;
return _walk;
} else {
_walk.$step = 4;
_walk.$step = 4;
continue;
}
case _core.Tag.Identifier:
if (specVars != null && specNames[i.value.node.name]) {
specVars[i.value.node.name] = true;
if (i.enter) {
b = s.tok(i.pos, T.identifier(`e$y$${i.value.node.name}`));
_walk.$step = 4;
_walk.value = b;
return _walk;
} else {
_walk.$step = 4;
_walk.$step = 4;
continue;
}
} else {
_walk.$step = 11;
_walk.$step = 11;
continue;
}
case _core.Tag.FunctionExpression:
case _core.Tag.ArrowFunctionExpression:
case _core.Tag.FunctionDeclaration:
_walk.$step = 11;
_walk.$step = 11;
continue;
default:
_walk.$step = 13;
_walk.$step = 13;
continue;
}
} else {
_walk.$step = 0;
_walk.value = void 0;
_walk.done = true;
return _walk;
}
case 5:
a = s.tok(_core.Tag.callee, T.identifier(i.value.node.delegate ? "e$y$star" : "e$y"));
_walk.$step = 6;
_walk.value = a;
return _walk;
case 6:
a = s.enter(_core.Tag.arguments, _core.Tag.Array);
_walk.$step = 7;
_walk.value = a;
return _walk;
case 7:
a = s.tok(_core.Tag.push, T.identifier("e$y$buf"));
_walk.$step = 8;
_walk.value = a;
return _walk;
case 8:
a = s.enter(_core.Tag.push, Kit.Subst);
_walk.$step = 9;
_walk.value = a;
return _walk;
case 9:
a = walk(specVars);
_walk.$step = 10;
return _walk.$delegate(a);
case 10:
a = lab();
_walk.$step = 4;
return _walk.$delegate(a);
case 11:
if (i.enter && i.value.node.generator) {
_walk.$step = 12;
_walk.value = i;
return _walk;
} else {
_walk.$step = 13;
_walk.$step = 13;
continue;
}
case 12:
a = make(i);
_walk.$step = 4;
return _walk.$delegate(a);
case 13:
_walk.$step = 4;
_walk.value = i;
return _walk;
case 0:
_walk.$step = 0;
_walk.value = p;
_walk.done = true;
return _walk;
case 1:
_walk.$step = 0;
throw p;
case 2:
return _walk.$redir(p);
default:
throw new Error("invalid state");
}
}
}
},
i,
_transform = M.generator(),
loop,
r,
p;
_transform.step = transform_1;
_transform.$step = 3;
return _transform;
function transform_1(p) {
var a, b;
for (;;) {
switch (_transform.$cur = _transform.$step) {
case 3:
loop = M.iterator(s);
_transform.$step = 4;
_transform.$step = 4;
continue;
case 4:
if (!(loop = loop.step()).done) {
i = loop.value;
_transform.$step = 5;
_transform.value = i;
return _transform;
} else {
_transform.$step = 0;
_transform.value = void 0;
_transform.done = true;
return _transform;
}
case 5:
switch (i.type) {
case _core.Tag.Class:
case _core.Tag.ClassBody:
case _core.Tag.ClassMethod:
case _core.Tag.FunctionExpression:
case _core.Tag.ArrowFunctionExpression:
case _core.Tag.FunctionDeclaration:
if (i.enter) {
if (!i.value.node.generator) {
_transform.$step = 4;
_transform.$step = 4;
continue;
} else {
if (Kit.hasAnnot(i.value.node, "@LAZY")) {
a = s.sub();
_transform.$step = 4;
return _transform.$delegate(a);
} else {
b = make(i);
_transform.$step = 4;
return _transform.$delegate(b);
}
}
} else {
_transform.$step = 4;
_transform.$step = 4;
continue;
}
default:
_transform.$step = 4;
_transform.$step = 4;
continue;
}
case 0:
_transform.$step = 0;
_transform.value = p;
_transform.done = true;
return _transform;
case 1:
_transform.$step = 0;
throw p;
case 2:
return _transform.$redir(p);
default:
throw new Error("invalid state");
}
}
}
}), Array.from, function completeSpecVars(si) {
var s,
i,
lab,
k,
j,
_completeSpecVars = M.generator(),
loop,
_loop,
r,
p;
_completeSpecVars.step = completeSpecVars_1;
_completeSpecVars.$step = 3;
return _completeSpecVars;
function completeSpecVars_1(p) {
var a, b;
for (;;) {
switch (_completeSpecVars.$cur = _completeSpecVars.$step) {
case 3:
s = Kit.auto(si);
loop = M.iterator(s);
_completeSpecVars.$step = 4;
_completeSpecVars.$step = 4;
continue;
case 4:
if (!(loop = loop.step()).done) {
i = loop.value;
if (i.type === SpecVars) {
lab = s.label();
k = Object.keys(i.value.node);
if (k.length) {
a = s.enter(i.pos, _core.Tag.VariableDeclaration, {
node: {
kind: "var"
}
});
_completeSpecVars.$step = 5;
_completeSpecVars.value = a;
return _completeSpecVars;
} else {
_completeSpecVars.$step = 4;
_completeSpecVars.$step = 4;
continue;
}
} else {
_completeSpecVars.$step = 4;
_completeSpecVars.value = i;
return _completeSpecVars;
}
} else {
_completeSpecVars.$step = 0;
_completeSpecVars.value = void 0;
_completeSpecVars.done = true;
return _completeSpecVars;
}
case 5:
a = s.enter(_core.Tag.declarations, _core.Tag.Array);
_completeSpecVars.$step = 6;
_completeSpecVars.value = a;
return _completeSpecVars;
case 6:
_loop = M.iterator(k);
_completeSpecVars.$step = 7;
_completeSpecVars.$step = 7;
continue;
case 7:
if (!(_loop = _loop.step()).done) {
j = _loop.value;
a = s.enter(_core.Tag.push, _core.Tag.VariableDeclarator);
_completeSpecVars.$step = 8;
_completeSpecVars.value = a;
return _completeSpecVars;
} else {
b = lab();
_completeSpecVars.$step = 4;
return _completeSpecVars.$delegate(b);
}
case 8:
a = s.tok(_core.Tag.id, T.identifier(`e$y$${j}`));
_completeSpecVars.$step = 9;
_completeSpecVars.value = a;
return _completeSpecVars;
case 9:
a = s.tok(_core.Tag.init, T.identifier(j));
_completeSpecVars.$step = 10;
_completeSpecVars.value = a;
return _completeSpecVars;
case 10:
a = s.leave();
_completeSpecVars.$step = 7;
return _completeSpecVars.$delegate(a);
case 0:
_completeSpecVars.$step = 0;
_completeSpecVars.value = p;
_completeSpecVars.done = true;
return _completeSpecVars;
case 1:
_completeSpecVars.$step = 0;
throw p;
case 2:
return _completeSpecVars.$redir(p);
default:
throw new Error("invalid state");
}
}
}
}, Kit.completeSubst);