@@ -18,13 +18,41 @@ for i,v in pairs(t) do new[i] = v end setmetatable(new,getmetatable(t)) return new end + +fn.deepcopy = table.copy or function(t) + new = {} + for k,v in pairs(t) do + if type(v) == 'table' then + new[k] = fn.deepcopy(v) + else + new[k] = v + end + end + return new +end fn.merge = function(base,override) local new = fn.copy(base) for k,v in pairs(override) do new[k] = v + end + return new +end + +fn.deepmerge = function(base,override) + local new = {} + local keys = fn.merge(fn.keys(base),fn.keys(override)) + for _,k in pairs(keys) do + if type(base[k]) == 'table' and + type(override[k]) == 'table' then + new[k] = fn.deepmerge(base[k], override[k]) + elseif override[k] then + new[k] = override[k] + else + new[k] = base[k] + end end return new end @@ -108,6 +136,18 @@ end end return acc end + +fn.walk = function(tbl,path) + if type(path) == 'table' then + for _,p in pairs(path) do + if tbl[p] == nil then return nil end + tbl = tbl[p] + end + else + tbl = tbl[path] + end + return tbl +end return fn