local M = {}

-- See [this original implementation](https://github.com/coltonj96/UsefulCombinators/blob/master/UsefulCombinators_0.4.4/control.lua#L2062)
---Get the total count of some signal in some control behavior.
---@param control LuaControlBehavior
---@param signal SignalID
function M.get_signal_count(control, signal)
  if not signal then
    return 0
  end

  local red = control.get_circuit_network(defines.wire_type.red)
  local green = control.get_circuit_network(defines.wire_type.green)

  local total = 0

  if red then
    total = total + (red.get_signal(signal) or 0)
  end

  if green then
    total = total + (green.get_signal(signal) or 0)
  end

  return total
end

---Returns the index if going past #array or under 1 would loop back the other side.
---Assumes the array is nonempty
---@generic T
---@param array T[]
---@param index integer
---@returns integer
---@nodiscard
function M.mod_index(array, index)
  return (index - 1) % #array + 1
end

---Uses the above function to normalize the index between the start and end of the array.
---Assumes the array is nonempty
---@generic T
---@param array T[]
---@param index integer
---@return T
---@nodiscard
function M.get_cycled(array, index)
  return array[M.mod_index(array, index)]
end

---Annotated version of table.inset
---@generic T
---@param list T[]
---@param at integer
---@param value T
function M.list_insert(list, at, value)
  table.insert(list, at, value)
end

---Shallow copies some table
---@generic T :table
---@param object T
---@return T
function M.copy(object)
  local result = {}

  for k, v in pairs(object) do
    result[k] = v
  end

  return result
end

return M