local function routine(fun, args)
while (fun) do
fun, args = coroutine.yield(fun(table.unpack(args)));
end
end
local Sum = function(...)
local sum = 0;
for i=1, select("#", ...) do
sum = sum + select(i, ...);
end
return sum;
end
local Avg = function(...)
local N = select("#", ...);
if 0==N then
return 0;
else
return Sum(...) / N;
end
end
local co = coroutine.create(routine);
print(coroutine.resume(co, Sum, {}));
print(coroutine.resume(co, Sum, {1}));
print(coroutine.resume(co, Sum, {1,2}));
print(coroutine.resume(co, Sum, {1,2,3}));
print(coroutine.resume(co, Avg, {}));
print(coroutine.resume(co, Avg, {1}));
print(coroutine.resume(co, Avg, {1,2}));
print(coroutine.resume(co, Avg, {1,2,3}));
print();
print();
local Login = function(user, pass)
print(user .. " step1");
coroutine.yield();
print(user .. " step2");
coroutine.yield();
print(user .. " step3");
coroutine.yield();
print(user .. " step4");
coroutine.yield();
if (user == pass) then
print(user .. " succ");
else
print(user .. " fail");
end
end
local coA = coroutine.create(routine);
local coB = coroutine.create(routine);
print();
coroutine.resume(coA, Login, {"user1", "user1"});
coroutine.resume(coB, Login, {"user2", "test2"});
print();
coroutine.resume(coA);
coroutine.resume(coA);
print();
coroutine.resume(coB);
coroutine.resume(coB);
print();
coroutine.resume(coB);
coroutine.resume(coA);
print();
coroutine.resume(coB);
coroutine.resume(coA);
print();
print();
print();
coroutine.resume(coA, Login, {"user3", "test3"});
coroutine.resume(coB, Login, {"user4", "user4"});
print();
coroutine.resume(coA);
coroutine.resume(coA);
print();
coroutine.resume(coB);
coroutine.resume(coB);
print();
coroutine.resume(coB);
coroutine.resume(coA);
print();
coroutine.resume(coB);
coroutine.resume(coA);