local Queue = function()
    local queue = {};
    local tail = 0;
    local head = 0;

    local public = {};

    public.push = function(obj)
        queue[head] = obj;
        head = head + 1;
        return;
    end

    public.pop = function()
        if tail < head
        then
            local obj = queue[tail];
            queue[tail] = nil;
            tail = tail + 1;
            return obj;
        else
            return nil;
        end
    end

    public.size = function()
        return head - tail;
    end

    public.getHead = function()
        return head;
    end

    public.getTail = function()
        return tail;
    end

    public.reset = function()
        queue = {};
        head = 0;
        tail = 0;
    end

    return public;
end

return Queue;