-- Copyright 2025 David Vazgenovich Shakaryan local util = require('util') local mp_utils = require('mp.utils') local cacher = {} local function wrap_func(obj, opts, func, func_name) return function(_, ...) local fn = table.concat({opts.prefix, func_name, ...}, '.') local path = mp_utils.join_path(opts.directory, fn) local f = mp_utils.file_info(path) local data if not f or os.time() - f.mtime > opts.time then data = func(obj, ...) if data then util.write_json_file(path, data) end end if f and not data then print('using cached ' .. fn) data = util.read_json_file(path) end return data end end function cacher.wrap(obj, opts) local proxy = {} setmetatable(proxy, { __index = function(t, k) local v = obj[k] if type(v) ~= 'function' or not opts.functions[k] then return v end local fn = wrap_func(obj, opts, v, k) t[k] = fn return fn end, }) return proxy end return cacher