Core.async uses code rewriting to turn blocks of code into state machines. From there puts and takes from channels become state transitions. It works almost exactly like async&#x2F;await in C# or Yield based generators in other languages. The cool bit is that core.async does this as a library, not a compiler level feature.