diff --git a/init.lua b/init.lua index b181400..ba891f5 100644 --- a/init.lua +++ b/init.lua @@ -8,6 +8,7 @@ building_lib = { } local MP = minetest.get_modpath("building_lib") +dofile(MP .. "/memoize.lua") dofile(MP .. "/entity.lua") dofile(MP .. "/preview.lua") dofile(MP .. "/api.lua") diff --git a/memoize.lua b/memoize.lua new file mode 100644 index 0000000..1a6580c --- /dev/null +++ b/memoize.lua @@ -0,0 +1,24 @@ + +local cache = {} + +function building_lib.memoize(fn, keyfn) + return function(...) + local key = keyfn(...) + if not cache[key] then + cache[key] = { fn(...) } + end + return unpack(cache[key]) + end +end + +function building_lib.memoize_invalidate(key) + cache[key] = nil +end + +-- periodic cleanup +local function purge_cache() + cache = {} + minetest.after(300, purge_cache) +end + +minetest.after(10, purge_cache) \ No newline at end of file