I'm trying to re-write the table.insert function. Since table.insert uses rawset (which is the reason it doesn't invoke any metamethods), I'm trying to make my own table.insert function that sets a value to a table by creating a new index. Here's the problem:

My problem with this, is table.insert's second argument as it's position. When using the second argument as the position you're giving the value, table.insert pushes all other values up the list by 1. For example:

local t = {'a','b','c'}

table.insert(t,1,'z') -- this is basically what I'm trying to re-create

print(unpack(t)) -- output: 'z' 'a' 'b' 'c'

I've attempted to make a function for this, but only got this far:

local t = {'a','b','c'}

-- Basically just making a new reference to the table library, and a separate one for the insert function.

local table=setmetatable({},{
	__index=function(tab,k)
		if(k=='insert')then
			return function(tab,pos,val)
				if(type(pos)=='number')and(val)then
					local n=0
					for i=pos,#tab do
						tab[i+1]=tab[i+n] -- the problem?
						n=n+1
					end
					tab[pos]=val
				elseif(pos)and(not val)then
					-- in this case, "pos" is the value
					tab[#tab+1]=pos
				end
			end
		else
			-- If it's not the insert function, return the default from the given index.
			return table[k]
		end
	end
})

table.insert(t,1,'z')

-- The insert function above outputs:

-- 1 z
-- 2 a
-- 3 c

-- When it should be:

-- 1 z
-- 2 a
-- 3 b
-- 4 c

Or maybe the problem is with my for loop iterations, but I'm not sure.

So basically, I could shorten the question to this:

How could I make a function that can push each value in a list's numeric index, up by 1?

This has REALLY been an issue for me, and would help a lot considering I'm in specific need of something like this. Any small example or algorithm with minimal explanation would be very much appreciated. Thank you for reading.