Coroutine Concepts
Producer State
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
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)
limit ← 3, produced ← 0, lastValue ← 0, state ← ready
1local limit→ 3 = 3 --@limit=2, 42local produced→ 0 = 03local lastValue→ 0 = 04local state→ ready = "ready"produced ← 1, lastValue ← 1, state ← yielded
pass 1 of 36while produced0 < limit3 do7 produced→ 1 = produced + 18 lastValue→ 1 = produced19 state→ yielded = "yielded"10endAll 3 passes — pass 1 is the card above pass producedlastValuestate1 0 → 1 1 yielded 2 1 → 2 2 yielded 3 2 → 3 3 yielded print("limit=" .. limit)
12print("limit=" .. limit3)13print("produced=" .. produced3)14print("lastValue=" .. lastValue3)15print("state=" .. stateyielded)outputlimit=3 produced=3 lastValue=3 state=yielded
limit ← 2, produced ← 0, lastValue ← 0, state ← ready
1local limit→ 2 = 22local produced→ 0 = 03local lastValue→ 0 = 04local state→ ready = "ready"produced ← 1, lastValue ← 1, state ← yielded
pass 1 of 26while produced0 < limit2 do7 produced→ 1 = produced + 18 lastValue→ 1 = produced19 state→ yielded = "yielded"10endproduced ← 2, lastValue ← 2, state ← yielded
pass 2 of 26while produced1 < limit2 do7 produced→ 2 = produced + 18 lastValue→ 2 = produced29 state→ yielded = "yielded"10endprint("limit=" .. limit)
12print("limit=" .. limit2)13print("produced=" .. produced2)14print("lastValue=" .. lastValue2)15print("state=" .. stateyielded)outputlimit=2 produced=2 lastValue=2 state=yielded
limit ← 4, produced ← 0, lastValue ← 0, state ← ready
1local limit→ 4 = 42local produced→ 0 = 03local lastValue→ 0 = 04local state→ ready = "ready"produced ← 1, lastValue ← 1, state ← yielded
pass 1 of 46while produced0 < limit4 do7 produced→ 1 = produced + 18 lastValue→ 1 = produced19 state→ yielded = "yielded"10endAll 4 passes — pass 1 is the card above pass producedlastValuestate1 0 → 1 1 yielded 2 1 → 2 2 yielded 3 2 → 3 3 yielded 4 3 → 4 4 yielded print("limit=" .. limit)
12print("limit=" .. limit4)13print("produced=" .. produced4)14print("lastValue=" .. lastValue4)15print("state=" .. stateyielded)outputlimit=4 produced=4 lastValue=4 state=yielded