Coroutines are often used to produce one value at a time.

producer A producer can keep its position between steps. This example models that position with scalar counters.

Producer State

limit
producer_state.lua
Replay: real traced execution (multi-file project)
local limit = 3
local produced = 0
local lastValue = 0
local state = "ready"

while produced < limit do
  produced = produced + 1
  lastValue = produced
  state = "yielded"
end

print("limit=" .. limit)
print("produced=" .. produced)
print("lastValue=" .. lastValue)
print("state=" .. state)
local limit = 2
local produced = 0
local lastValue = 0
local state = "ready"

while produced < limit do
  produced = produced + 1
  lastValue = produced
  state = "yielded"
end

print("limit=" .. limit)
print("produced=" .. produced)
print("lastValue=" .. lastValue)
print("state=" .. state)
local limit = 4
local produced = 0
local lastValue = 0
local state = "ready"

while produced < limit do
  produced = produced + 1
  lastValue = produced
  state = "yielded"
end

print("limit=" .. limit)
print("produced=" .. produced)
print("lastValue=" .. lastValue)
print("state=" .. state)
  1. limit ← 3, produced ← 0, lastValue ← 0, state ← ready

    1local limit→ 3 = 3 --@limit=2, 42local produced→ 0 = 03local lastValue→ 0 = 04local state→ ready = "ready"
  2. produced ← 1, lastValue ← 1, state ← yielded

    pass 1 of 3
    6while produced0 < limit3 do7  produced→ 1 = produced + 18  lastValue→ 1 = produced19  state→ yielded = "yielded"10end
    All 3 passes — pass 1 is the card above
    passproducedlastValuestate
    10 11yielded
    21 22yielded
    32 33yielded
  3. print("limit=" .. limit)

    12print("limit=" .. limit3)13print("produced=" .. produced3)14print("lastValue=" .. lastValue3)15print("state=" .. stateyielded)
    outputlimit=3
    produced=3
    lastValue=3
    state=yielded
  1. limit ← 2, produced ← 0, lastValue ← 0, state ← ready

    1local limit→ 2 = 22local produced→ 0 = 03local lastValue→ 0 = 04local state→ ready = "ready"
  2. produced ← 1, lastValue ← 1, state ← yielded

    pass 1 of 2
    6while produced0 < limit2 do7  produced→ 1 = produced + 18  lastValue→ 1 = produced19  state→ yielded = "yielded"10end
  3. produced ← 2, lastValue ← 2, state ← yielded

    pass 2 of 2
    6while produced1 < limit2 do7  produced→ 2 = produced + 18  lastValue→ 2 = produced29  state→ yielded = "yielded"10end
  4. print("limit=" .. limit)

    12print("limit=" .. limit2)13print("produced=" .. produced2)14print("lastValue=" .. lastValue2)15print("state=" .. stateyielded)
    outputlimit=2
    produced=2
    lastValue=2
    state=yielded
  1. limit ← 4, produced ← 0, lastValue ← 0, state ← ready

    1local limit→ 4 = 42local produced→ 0 = 03local lastValue→ 0 = 04local state→ ready = "ready"
  2. produced ← 1, lastValue ← 1, state ← yielded

    pass 1 of 4
    6while produced0 < limit4 do7  produced→ 1 = produced + 18  lastValue→ 1 = produced19  state→ yielded = "yielded"10end
    All 4 passes — pass 1 is the card above
    passproducedlastValuestate
    10 11yielded
    21 22yielded
    32 33yielded
    43 44yielded
  3. print("limit=" .. limit)

    12print("limit=" .. limit4)13print("produced=" .. produced4)14print("lastValue=" .. lastValue4)15print("state=" .. stateyielded)
    outputlimit=4
    produced=4
    lastValue=4
    state=yielded