scheduler.lua
1 local M = {} 2 3 local timer_pending = {} 4 5 function M.once(bufnr, key, delay_ms, fn) 6 local token = string.format("%d:%s", bufnr, key) 7 if timer_pending[token] then 8 return 9 end 10 timer_pending[token] = true 11 vim.defer_fn(function() 12 timer_pending[token] = nil 13 fn() 14 end, delay_ms) 15 end 16 17 function M.next_tick(bufnr, key, fn) 18 local token = string.format("%d:%s", bufnr, key) 19 if timer_pending[token] then 20 return 21 end 22 timer_pending[token] = true 23 vim.schedule(function() 24 timer_pending[token] = nil 25 fn() 26 end) 27 end 28 29 function M.clear_for_buffer(bufnr) 30 local prefix = tostring(bufnr) .. ":" 31 for token, _ in pairs(timer_pending) do 32 if token:sub(1, #prefix) == prefix then 33 timer_pending[token] = nil 34 end 35 end 36 end 37 38 return M