# HG changeset patch # User Matthew Wild # Date 1254761791 -3600 # Node ID e9d5406caf8c3a8e4abe9261f9fc59872473805b # Parent 1dd4443e7d93a68ec1b13eac0441034a672ecfd6 util.array: Fix for array:filter() (in-place filtering) diff -r 1dd4443e7d93 -r e9d5406caf8c util/array.lua --- a/util/array.lua Mon Oct 05 14:42:23 2009 +0100 +++ b/util/array.lua Mon Oct 05 17:56:31 2009 +0100 @@ -33,11 +33,22 @@ end function array_base.filter(outa, ina, func) - for k,v in ipairs(ina) do + local inplace, start_length = ina == outa, #ina; + local write = 1; + for read=1,start_length do + local v = ina[read]; if func(v) then - outa:push(v); + outa[write] = v; + write = write + 1; end end + + if inplace and write < start_length then + for i=write,start_length do + outa[i] = nil; + end + end + return outa; end