Перейти к содержанию
Материалы раздела

utils.lua

Библиотека с вспомогательными утилитами. Расширяет модуль cutils дополнительными функциями для работы с таблицами, профилирования и управления временем.

local utils = require("utils")

utils.printTable(t, [indent])

Рекурсивно выводит содержимое таблицы в консоль.

Аргументы:

  • t - таблица для вывода
  • indent (опционально) - начальный отступ (строка)
local data = {
    name = "test",
    nested = {
        value = 123
    }
}
utils.printTable(data)
-- name: test
-- nested:
--   value: 123

utils.profile(func, …)

Измеряет время выполнения функции.

Аргументы:

  • func - функция для профилирования
  • … - аргументы функции

Возвращает: время выполнения в секундах

local function heavyTask(n)
    local sum = 0
    for i = 1, n do sum = sum + i end
    return sum
end

local elapsed = utils.profile(heavyTask, 1000000)
print("Time: " .. elapsed .. " sec")

utils.perioder(lifetime)

Создаёт таймер для периодического вызова функции.

Аргументы:

  • lifetime - положительная длительность периода в секундах

Возвращает объект таймера.

local p = utils.perioder(10)  -- 10 секунд

perioder:start(cb, [now])

Запускает таймер.

Аргументы:

  • cb — вызываемая функция;
  • now (опционально) - текущее время (по умолчанию os.time())

perioder:check([now])

Проверяет, истёк ли период. Если да, вызывает сохранённую функцию и запускает отсчёт заново. Даже при частом опросе функция выполняется не чаще одного раза за период lifetime.

Аргументы:

  • now (опционально) - текущее время (по умолчанию os.time())

Возвращает true, если функция была вызвана, иначе — false. Период считается истёкшим при now - start_time >= lifetime.

perioder:stop()

Останавливает таймер и удаляет сохранённую функцию.

perioder:ltime(l)

Устанавливает новое время жизни.

Аргументы:

  • l - новое время жизни в секундах
local p = utils.perioder(5)
p:start(function() print("Tick!") end)

-- в цикле: "Tick!" печатается раз в 5 секунд
while true do
    p:check()
    thread.sleepms(100)
end

utils.time_filter(lifetime)

Создаёт временной фильтр, который автоматически удаляет устаревшие элементы.

Аргументы:

  • lifetime - время жизни элементов в секундах

Возвращает: объект time_filter

local filter = utils.time_filter(60)  -- элементы живут 60 секунд

time_filter:append(key, [now])

Добавляет элемент в фильтр.

Аргументы:

  • key - ключ элемента
  • now (опционально) - текущее время (по умолчанию os.time())

time_filter:find(key, [noclean])

Ищет элемент в фильтре.

Аргументы:

  • key - ключ для поиска
  • noclean (опционально) - если true, не выполнять очистку устаревших элементов

Возвращает: время добавления элемента или nil

time_filter:clean([now])

Удаляет устаревшие элементы.

Аргументы:

  • now (опционально) - текущее время (по умолчанию os.time())
local seen = utils.time_filter(30)

-- добавляем карту
seen:append("card_123")

-- проверяем, видели ли карту недавно
if seen:find("card_123") then
    print("Already seen")
else
    print("New card")
    seen:append("card_123")
end

utils.hasUtf8

Флаг, указывающий, доступен ли модуль utf8.

if utils.hasUtf8 then
    print("UTF-8 support available")
end

utils.utf8Length(str)

Возвращает длину строки в символах UTF-8.

Аргументы:

  • str - строка

Возвращает: количество символов

local len = utils.utf8Length("Привет")  -- 6

utils.kvprint(data, [printFunc], [indent])

Выводит данные в формате ключ-значение с выравниванием. Вызывается через точку, не через двоеточие.

Аргументы:

  • data - массив пар {ключ, значение}
  • printFunc (опционально) - функция вывода (по умолчанию print)
  • indent (опционально) - отступ между ключом и значением в пробелах (число, по умолчанию 1)
local info = {
    {"IP",      "192.168.1.100"},
    {"MAC",     "AA:BB:CC:DD:EE:FF"},
    {"Version", "1.0.0"}
}
utils.kvprint(info, nil, 2)
-- IP       192.168.1.100
-- MAC      AA:BB:CC:DD:EE:FF
-- Version  1.0.0