/**
 * @module RateLimiter
 */
/**
 * @internal
 */
export declare const slidingWindowLimiterLua = "\n-- @param settings Required<SerializedSlidingWindowLimiterSettings>\n-- @return IRateLimiterPolicy<SlidingWindowLimiterState>\nlocal function SlidingWindowLimiter(settings)\n    -- @param currentDate number\n    -- @return number\n    local function currentWindow(currentDate)\n        return math.floor(currentDate / settings.window) * settings.window\n    end\n\n    -- @param currentDate number\n    -- @return number\n    local function previousWindow(currentDate)\n        return currentWindow(currentDate) - settings.window\n    end\n\n    -- @param metrics SlidingWindowLimiterState\n    -- @param currentDate number\n    -- @return SlidingWindowLimiterState\n    local function cleanup(metrics, currentDate)\n        local previousWindow_ = previousWindow(currentDate)\n        local newMetrics = {}\n\n        for key, value in pairs(metrics) do\n            local timeStamp = tonumber(timeStampAsStr)\n            if timeStamp >= previousWindow_ then\n                newMetrics[key] = value\n            end\n        end\n\n        return newMetrics\n    end\n\n    -- @param currentMetrics SlidingWindowLimiterState\n    -- @param currentDate number\n    -- @return number\n    local function currentAttempt(currentMetrics, currentDate)\n        local currentAttempt = currentMetrics[currentWindow(currentDate)]\n        if currentAttempt == nil or currentAttempt == cjson.null then\n            currentAttempt = 0\n        end\n\n        return currentAttempt\n    end\n\n    -- @param currentMetrics SlidingWindowLimiterState\n    -- @param currentDate number\n    -- @return number\n    local function previousAttempt(currentMetrics, currentDate)\n        local previousAttempt = currentMetrics[previousWindow(currentDate)]\n        if previousAttempt == nil or previousAttempt == cjson.null then\n            previousAttempt = 0\n        end\n\n        local percentageInCurrentWindow = currentDate % settings.window / settings.window\n        return math.floor((1 - percentageInCurrentWindow) * previousAttempt)\n    end\n\n    return {\n        -- @param currentDate number\n        -- @return SlidingWindowLimiterState\n        initialMetrics = function(currentDate)\n            local metrics = {}\n            metrics[currentWindow(currentDate)] = 0\n            return metrics\n        end,\n\n        -- @param currentMetrics SlidingWindowLimiterState\n        -- @param limit number\n        -- @param currentDate number\n        -- @return boolean\n        shouldBlock = function(currentMetrics, limit, currentDate)\n            local currentAttempt_ = currentAttempt(currentMetrics, currentDate)\n            local previousAttempt_ = previousAttempt(currentMetrics, currentDate)\n            return currentAttempts + previousAttempts >= limit\n        end,\n\n        -- @param _currentMetrics SlidingWindowLimiterState\n        -- @param currentDate number\n        -- @return number\n        getExpiration = function(_currentMetrics, currentDate)\n            return settings.window * 2 + settings.margin + currentDate\n        end,\n\n        -- @param currentMetrics SlidingWindowLimiterState\n        -- @param currentDate number\n        -- @return number\n        getAttempts = function(currentMetrics, currentDate)\n            local currentAttempt_ = currentAttempt(currentMetrics, currentDate)\n            local previousAttempt_ = previousAttempt(currentMetrics, currentDate)\n            return currentAttempt_ + previousAttempt_\n        end,\n\n        -- @param currentMetrics SlidingWindowLimiterState\n        -- @param currentDate number\n        -- @return SlidingWindowLimiterState\n        updateMetrics = function(currentMetrics, currentDate)\n            local currentMetrics_ = cleanup(currentMetrics, currentDate)\n            local currentAttempt = currentAttempt(currentMetrics, currentDate)\n            local currentKey = currentWindow(currentDate)\n            currentMetrics_[currentKey] = currentAttempt + 1\n            return currentMetrics_\n        end\n    }\nend\n";
