class 'bind'

function bind:__init(func, ...)
    assert(func)
    self.func = func
    self.args = {...}
end

function bind:__call(...)
    local args = {}
    
    for i, v in ipairs(self.args) do
        table.insert(args, v)
    end
    
    for i,v in ipairs({...}) do
        table.insert(args, v)
    end
    
    return self.func( unpack(args) )
end