Yield labels around a repeated action.

yield-steps Each `yield` can expose a named step in a longer process. The generator keeps its local state between yielded values.

Yield Steps

prefix
yield_steps.js
Replay: real traced execution (multi-file project)
const prefix = "step";
const labels = [];

function* steps(label) {
  yield label + "-start";
  yield label + "-middle";
  yield label + "-end";
}

for (const label of steps(prefix)) {
  labels.push(label);
}

console.log("prefix=" + prefix);
console.log("labels=" + labels.join("-"));
const prefix = "phase";
const labels = [];

function* steps(label) {
  yield label + "-start";
  yield label + "-middle";
  yield label + "-end";
}

for (const label of steps(prefix)) {
  labels.push(label);
}

console.log("prefix=" + prefix);
console.log("labels=" + labels.join("-"));
const prefix = "task";
const labels = [];

function* steps(label) {
  yield label + "-start";
  yield label + "-middle";
  yield label + "-end";
}

for (const label of steps(prefix)) {
  labels.push(label);
}

console.log("prefix=" + prefix);
console.log("labels=" + labels.join("-"));
  1. prefix ← step, labels ← (empty)

    1const prefix→ step = "step"; //@prefix="phase", "task"2const labels→ (empty) = [];
  2. function* steps(label)

    1const prefix = "step"; //@prefix="phase", "task"2const labels = [];34function* steps(labelstep) {5  yield label + "-start";6  yield label + "-middle";
  3. labels ← step-start,step-middle,step-end, label ← step

    4function* steps(label) {5  yield label→ step + "-start";6  yield label→ step + "-middle";7  yield label→ step + "-end";8}910for (const label of steps(prefix)) {11  labels.push(labelstep-end);12}1314console.log("prefix=" + prefixstep);15console.log("labels=" + labelsstep-start,step-middle,step-end.join("-"));
    outputprefix=step
    labels=step-start-step-middle-step-end
  1. prefix ← phase, labels ← (empty)

    1const prefix→ phase = "phase";2const labels→ (empty) = [];
  2. function* steps(label)

    1const prefix = "phase";2const labels = [];34function* steps(labelphase) {5  yield label + "-start";6  yield label + "-middle";
  3. labels ← phase-start,phase-middle,phase-end, label ← phase

    4function* steps(label) {5  yield label→ phase + "-start";6  yield label→ phase + "-middle";7  yield label→ phase + "-end";8}910for (const label of steps(prefix)) {11  labels.push(labelphase-end);12}1314console.log("prefix=" + prefixphase);15console.log("labels=" + labelsphase-start,phase-middle,phase-end.join("-"));
    outputprefix=phase
    labels=phase-start-phase-middle-phase-end
  1. prefix ← task, labels ← (empty)

    1const prefix→ task = "task";2const labels→ (empty) = [];
  2. function* steps(label)

    1const prefix = "task";2const labels = [];34function* steps(labeltask) {5  yield label + "-start";6  yield label + "-middle";
  3. labels ← task-start,task-middle,task-end, label ← task

    4function* steps(label) {5  yield label→ task + "-start";6  yield label→ task + "-middle";7  yield label→ task + "-end";8}910for (const label of steps(prefix)) {11  labels.push(labeltask-end);12}1314console.log("prefix=" + prefixtask);15console.log("labels=" + labelstask-start,task-middle,task-end.join("-"));
    outputprefix=task
    labels=task-start-task-middle-task-end