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