Module:Test/sandbox

From RimWorld Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

local util = {
  _DESCRIPTION = 'an assortment of useful things',
}

--ref: https://gist.github.com/ripter/4270799
function util.tprint(tbl, indent)
  if not indent then indent = 0 end

  if type(tbl) ~= "table" then
    print(tbl)
    return 0
  end

  for k, v in pairs(tbl) do
    formatting = string.rep("  ", indent) .. k .. ": "
    if type(v) == "table" then
      print(formatting)
      util.tprint(v, indent+1)
    elseif type(v) == 'boolean' then
      print(formatting .. tostring(v))
    else
      print(formatting .. v)
    end
  end
end

--ref: http://lua-users.org/wiki/CopyTable
function util.shallowcopy(original_table)
    local orig_type = type(original_table)
    local copy
    if orig_type == 'table' then
        copy = {}
        for orig_key, orig_value in pairs(original_table) do
            copy[orig_key] = orig_value
        end
    else -- number, string, boolean, etc
        copy = original_table
    end
    return copy
end

--ref: https://gist.github.com/balaam/3122129
function util.reverse_numeric_table(tbl)
    local reversed_table = {}
    local length = #tbl
    for i,v in ipairs(tbl) do
        reversed_table[length + 1 - i] = v
    end
    return reversed_table
end

---procedure
function util.hl(title, width)
  width = width or 80

  if type(title) == "string" then
    title = " " .. title .. " "
    local before = math.floor((width - #title) / 2)
    local after = width - before - #title
    print(string.rep("-", before) .. title .. string.rep("-", after))
  else
    print(string.rep("-", width))
  end
end

function util.count(tbl, key_type)
  local length = 0;
  for k,v in pairs(tbl) do
    if key_type then
      if type(k) == key_type then
        length = length + 1
      end
    else
      length = length + 1
    end
  end
  return length
end

-- "delimiter" must be a single character or the removal of the final one won't work
function util.table_to_csv_string(simple_table, delimiter)
  local f_name = "string_csv"
  delimiter = tostring(delimiter) or ","
  assert(#delimiter == 1, string.format("bad argument #2 to '%s' (single character expected)", f_name))

  local list = ""

  for k,v in pairs(simple_table) do
    list = tostring(list) .. v .. delimiter
  end
  list = string.sub(list, 1, -2)
  return list
end

---procedure
-- this could be implemented with metatable events
-- ignore_keys: {"foo", "bar", ... }
function util.overwrite_first_table_with_second(first_table, second_table, ignore_keys)
  ignore_keys = ignore_keys or {}

  for k,v in pairs(second_table) do
    local ignore = false

    for _, ignored_key in ipairs(ignore_keys) do
      if k == ignored_key then ignore = true end
    end

    if not ignore then
      if type(v) == "table" then
        if type(first_table[k]) == "table" then
          util.overwrite_first_table_with_second(first_table[k], v)
        else
          first_table[k] = {}
          util.overwrite_first_table_with_second(first_table[k], v)
        end
      else
        first_table[k] = v
      end
    end
  end
end

return util