Module:Test/lib/util

From RimWorld Wiki
< Module:Test
Revision as of 17:01, 13 April 2021 by Dr. Strangelove (talk | contribs) (Created page with "local util = { _DESCRIPTION = 'an assortment of useful things', } --ref: https://gist.github.com/ripter/4270799 function util.tprint(tbl, indent) if not indent then inden...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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