yieldmachine icon indicating copy to clipboard operation
yieldmachine copied to clipboard

Compile Library away to imperative code

Open RoyalIcing opened this issue 3 years ago • 0 comments

Before:

import { start } from "yieldmachine";

function TrafficLights() {
  function* Red() {
    yield on("timer", Green);
  }
  function* Green() {
    yield on("timer", Yellow);
  }
  function* Yellow() {
    yield on("timer", Red);
  }

  return Red;
}

const m = start(TrafficLights);
m.current; // { state: "Red", count: 0 }
m.next("timer");
m.current; // { state: "Green", count: 1 }
m.next("timer");
m.current; // { state: "Yellow", count: 2 }

After compiles to:


function* startTrafficLights() {
  let count = 0;
  let state = "Red";

  return {
    get current() {
      return Object.freeze({ count, state });
    }
    next(event) {
      if (event === "timer") {
        count++;
        if (state === "Red") {
          state = "Green";
        } else if (state === "Green") {
          state = "Yellow";
        } else if (state === "Yellow") {
          state = "Red";
        }
      }
      return { value: this.current, done: false };
    },
  };
}

const m = startTrafficLights();
m.current; // { state: "Red", count: 0 }
m.next("timer");
m.current; // { state: "Green", count: 1 }
m.next("timer");
m.current; // { state: "Yellow", count: 2 }

RoyalIcing avatar Feb 22 '22 02:02 RoyalIcing