Resume a Lua coroutine a fixed number of times and label the coordination state from the resume count and final coroutine status.

coroutine resume A coroutine yields control on each step and resumes deterministically, so the resumed-step count and the final status stay scalar.

Coroutine Resume Coordination Report

resumes
coroutine_resume.lua
Replay: real traced execution (multi-file project)
local resumes = 2
local yields = 2
local steps = 0
local co_status = "suspended"

for attempt = 1, resumes do
  if attempt <= yields then
    steps = steps + 1
  else
    co_status = "dead"
  end
end

local report_status = "primed"
if co_status == "dead" then
  report_status = "drained"
elseif steps >= 2 then
  report_status = "flowing"
end

print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. report_status)
local resumes = 1
local yields = 2
local steps = 0
local co_status = "suspended"

for attempt = 1, resumes do
  if attempt <= yields then
    steps = steps + 1
  else
    co_status = "dead"
  end
end

local report_status = "primed"
if co_status == "dead" then
  report_status = "drained"
elseif steps >= 2 then
  report_status = "flowing"
end

print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. report_status)
local resumes = 3
local yields = 2
local steps = 0
local co_status = "suspended"

for attempt = 1, resumes do
  if attempt <= yields then
    steps = steps + 1
  else
    co_status = "dead"
  end
end

local report_status = "primed"
if co_status == "dead" then
  report_status = "drained"
elseif steps >= 2 then
  report_status = "flowing"
end

print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. report_status)
  1. resumes ← 2, yields ← 2, steps ← 0, co_status ← suspended

    1local resumes→ 2 = 2 --@resumes=1, 32local yields→ 2 = 23local steps→ 0 = 04local co_status→ suspended = "suspended"
  2. attempt = 1, resumes do

    pass 1 of 2
    6for attempt1 = 1, resumes2 do7  if attempt <= yields then8    steps = steps + 1
  3. steps ← 1

    pass 1 of 2
    6for attempt = 1, resumes do7  if attempt1 <= yields2 then8    steps→ 1 = steps + 19  else
  4. attempt = 1, resumes do

    pass 2 of 2
    6for attempt2 = 1, resumes2 do7  if attempt <= yields then8    steps = steps + 1
  5. steps ← 2

    pass 2 of 2
    6for attempt = 1, resumes do7  if attempt2 <= yields2 then8    steps→ 2 = steps + 19  else
  6. report_status ← primed

    14local report_status→ primed = "primed"15if co_status == "dead" then
  7. report_status ← flowing

    16  report_status = "drained"17elseif steps2 >= 2 then18  report_status→ flowing = "flowing"19end
  8. print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. rep…

    21print("resumes=" .. resumes2 .. " steps=" .. steps2 .. " status=" .. report_statusflowing)
    outputresumes=2 steps=2 status=flowing
  1. resumes ← 1, yields ← 2, steps ← 0, co_status ← suspended

    1local resumes→ 1 = 12local yields→ 2 = 23local steps→ 0 = 04local co_status→ suspended = "suspended"
  2. attempt = 1, resumes do

    6for attempt1 = 1, resumes1 do7  if attempt <= yields then8    steps = steps + 1
  3. steps ← 1

    6for attempt = 1, resumes do7  if attempt1 <= yields2 then8    steps→ 1 = steps + 19  else
  4. report_status ← primed

    14local report_status→ primed = "primed"15if co_status == "dead" then16  report_status = "drained"17elseif steps >= 2 then18  report_status = "flowing"19end2021print("resumes=" .. resumes1 .. " steps=" .. steps1 .. " status=" .. report_statusprimed)
    outputresumes=1 steps=1 status=primed
  1. resumes ← 3, yields ← 2, steps ← 0, co_status ← suspended

    1local resumes→ 3 = 32local yields→ 2 = 23local steps→ 0 = 04local co_status→ suspended = "suspended"
  2. attempt = 1, resumes do

    pass 1 of 3
    6for attempt1 = 1, resumes3 do7  if attempt <= yields then8    steps = steps + 1
    All 3 passes — pass 1 is the card above
    passattemptyieldsstepsco_status
    1120 1
    2221 2
    33dead
  3. steps ← 1

    pass 1 of 2
    6for attempt = 1, resumes do7  if attempt1 <= yields2 then8    steps→ 1 = steps + 19  else
  4. steps ← 2

    pass 2 of 2
    6for attempt = 1, resumes do7  if attempt2 <= yields2 then8    steps→ 2 = steps + 19  else
  5. co_status ← dead

    8  steps = steps + 19else10  co_status→ dead = "dead"11end
  6. report_status ← primed

    14local report_status→ primed = "primed"15if co_status == "dead" then
  7. report_status ← drained

    14local report_status = "primed"15if co_statusdead == "dead" then16  report_status→ drained = "drained"17elseif steps >= 2 then
  8. print("resumes=" .. resumes .. " steps=" .. steps .. " status=" .. rep…

    21print("resumes=" .. resumes3 .. " steps=" .. steps2 .. " status=" .. report_statusdrained)
    outputresumes=3 steps=2 status=drained