diff --git a/inferium-harvester.lua b/inferium-harvester.lua index df39604..da61c62 100644 --- a/inferium-harvester.lua +++ b/inferium-harvester.lua @@ -385,8 +385,8 @@ local function replantProcedure() error('cannot fetch the remote plan') end - local seedsToRemove = utils.difference(localPlan, remotePlan) - local seedsToPlant = utils.difference(remotePlan, localPlan) + local seedsToRemove = utils.shallowDiff(localPlan, remotePlan) + local seedsToPlant = utils.shallowDiff(remotePlan, localPlan) if utils.sizeof(seedsToRemove) > 0 then print('nb seeds to remove: ' .. utils.sizeof(seedsToRemove)) diff --git a/libs/utils.lua b/libs/utils.lua index 424481a..423981a 100644 --- a/libs/utils.lua +++ b/libs/utils.lua @@ -12,15 +12,31 @@ utils.sizeof = function(t) return size end -utils.difference = function(a, b) - local aa = {} - for k,v in pairs(a) do aa[v]=true end - for k,v in pairs(b) do aa[v]=nil end +utils.shallowDiff = function(a, b) + local counters = {} + + for k,v in pairs(a) do + local currentCounter = counters[v] or 0 + counters[v] = currentCounter + 1 + end + + for k,v in pairs(b) do + if counters[v] then + counters[v] = counters[v] - 1 + end + end + local ret = {} local n = 0 + for k,v in pairs(a) do - if aa[v] then n=n+1 ret[n]=v end + if counters[v] and counters[v] > 0 then + counters[v] = counters[v] - 1 + n = n + 1 + ret[n] = v + end end + return ret end