zip関数(2)

複数のテーブル対応版。テーブルのリスト部分のみに対応。

function zip(...)
  local args = {...}
  return coroutine.wrap(function ()
    local t = {}
    for i, arg in ipairs(args) do
      local ff,tt,nn = ipairs(arg)
      t[arg] = {ff,tt,nn}
    end
    local is_end = false
    while true do
      local vars = {}
      for k, v in pairs(t) do
        local ff,tt,nn = unpack(v)
        local ii, vv = ff(tt,nn)
        if not vv then
          is_end = true
        end
        t[k] = {ff,tt,nn+1}
        table.insert(vars, vv)
      end
      if is_end then
        break
      end
      coroutine.yield(unpack(vars))
    end
  end)
end

for a,b,c in zip({1,2,3}, {'a','b','c'}, {'d','e','f'}) do
  print(a,b,c)
end

--実行結果
a       1       d
b       2       e
c       3       f