Coroutine Concepts
Consumer Request
A consumer can request only part of a producer's sequence.
consumer
The consumer decides how many produced values it needs before stopping.
Consumer Request
consumer_request.lua
Replay: real traced execution (multi-file project)
local requested = 2
local consumed = 0
local lastItem = ""
for item = 1, 3 do
if consumed < requested then
consumed = consumed + 1
lastItem = "item" .. item
end
end
print("requested=" .. requested)
print("consumed=" .. consumed)
print("lastItem=" .. lastItem)
local requested = 1
local consumed = 0
local lastItem = ""
for item = 1, 3 do
if consumed < requested then
consumed = consumed + 1
lastItem = "item" .. item
end
end
print("requested=" .. requested)
print("consumed=" .. consumed)
print("lastItem=" .. lastItem)
local requested = 3
local consumed = 0
local lastItem = ""
for item = 1, 3 do
if consumed < requested then
consumed = consumed + 1
lastItem = "item" .. item
end
end
print("requested=" .. requested)
print("consumed=" .. consumed)
print("lastItem=" .. lastItem)
requested ← 2, consumed ← 0, lastItem ← (empty)
1local requested→ 2 = 2 --@requested=1, 32local consumed→ 0 = 03local lastItem→ (empty) = ""item = 1, 3 do
pass 1 of 35for item1 = 1, 3 do6 if consumed < requested then7 consumed = consumed + 1All 3 passes — pass 1 is the card above pass itemrequestedconsumedlastItem1 1 2 0 → 1 item1 2 2 2 1 → 2 item2 3 3 — — — consumed ← 1, lastItem ← item1
pass 1 of 25for item = 1, 3 do6 if consumed0 < requested2 then7 consumed→ 1 = consumed + 18 lastItem→ item1 = "item" .. item19 endconsumed ← 2, lastItem ← item2
pass 2 of 25for item = 1, 3 do6 if consumed1 < requested2 then7 consumed→ 2 = consumed + 18 lastItem→ item2 = "item" .. item29 endprint("requested=" .. requested)
12print("requested=" .. requested2)13print("consumed=" .. consumed2)14print("lastItem=" .. lastItemitem2)outputrequested=2 consumed=2 lastItem=item2
requested ← 1, consumed ← 0, lastItem ← (empty)
1local requested→ 1 = 12local consumed→ 0 = 03local lastItem→ (empty) = ""item = 1, 3 do
pass 1 of 35for item1 = 1, 3 do6 if consumed < requested then7 consumed = consumed + 1All 3 passes — pass 1 is the card above pass itemrequestedconsumedlastItem1 1 1 0 → 1 item1 2 2 — — — 3 3 — — — consumed ← 1, lastItem ← item1
5for item = 1, 3 do6 if consumed0 < requested1 then7 consumed→ 1 = consumed + 18 lastItem→ item1 = "item" .. item19 endprint("requested=" .. requested)
12print("requested=" .. requested1)13print("consumed=" .. consumed1)14print("lastItem=" .. lastItemitem1)outputrequested=1 consumed=1 lastItem=item1
requested ← 3, consumed ← 0, lastItem ← (empty)
1local requested→ 3 = 32local consumed→ 0 = 03local lastItem→ (empty) = ""item = 1, 3 do
pass 1 of 35for item1 = 1, 3 do6 if consumed < requested then7 consumed = consumed + 1All 3 passes — pass 1 is the card above pass item1 1 2 2 3 3 consumed ← 1, lastItem ← item1
pass 1 of 35for item = 1, 3 do6 if consumed0 < requested3 then7 consumed→ 1 = consumed + 18 lastItem→ item1 = "item" .. item19 endAll 3 passes — pass 1 is the card above pass itemconsumedlastItem1 1 0 → 1 item1 2 2 1 → 2 item2 3 3 2 → 3 item3 print("requested=" .. requested)
12print("requested=" .. requested3)13print("consumed=" .. consumed3)14print("lastItem=" .. lastItemitem3)outputrequested=3 consumed=3 lastItem=item3