
---@alias ltn12_source fun(): string?, string?
---@alias ltn12_sink fun(chunk:string?, err?:string): boolean?, string?
---@alias ltn12_filter fun(chunk:string?, ...): string?
---@alias ltn12_pump_step fun(src:ltn12_source, snk:ltn12_sink): boolean?, string?

---@class ltn12_filter_module*
local ltn12_filter_module = {}

---@class ltn12_source_module*
local ltn12_source_module = {}

---@class ltn12_sink_module*
local ltn12_sink_module = {}

---@class ltn12_pump_module*
local ltn12_pump_module = {}

---@class ltn12*
---@field BLOCKSIZE integer 默认块大小。
---@field _VERSION string 模块版本。
---@field filter ltn12_filter_module* 过滤器工厂。
---@field source ltn12_source_module* source 工厂。
---@field sink ltn12_sink_module* sink 工厂。
---@field pump ltn12_pump_module* pump 工具。
---@type ltn12*
local M = {}

M.BLOCKSIZE = 2048
M._VERSION = nil
M.filter = ltn12_filter_module
M.source = ltn12_source_module
M.sink = ltn12_sink_module
M.pump = ltn12_pump_module

--- 创建带状态的过滤器。
---@param low function 底层过滤函数。
---@param ctx? any 上下文。
---@param extra? any 额外参数。
---@return ltn12_filter filter 过滤器。
function ltn12_filter_module.cycle(low, ctx, extra) end

--- 串联多个过滤器。
---@param ... ltn12_filter 过滤器。
---@return ltn12_filter filter 串联后的过滤器。
function ltn12_filter_module.chain(...) end

--- 空 source。
---@return ltn12_source source source 函数。
function ltn12_source_module.empty() end

--- 总是返回错误的 source。
---@param err string 错误信息。
---@return ltn12_source source source 函数。
function ltn12_source_module.error(err) end

--- 从文件句柄创建 source。
---@param handle file* 文件句柄。
---@param io_err? string 打开文件时的错误。
---@return ltn12_source source source 函数。
function ltn12_source_module.file(handle, io_err) end

--- 简化 source 的错误处理。
---@param src ltn12_source source 函数。
---@return ltn12_source source source 函数。
function ltn12_source_module.simplify(src) end

--- 从字符串创建 source。
---@param value string 字符串。
---@return ltn12_source source source 函数。
function ltn12_source_module.string(value) end

--- 从 table 创建 source。
---@param values string[] 字符串列表。
---@return ltn12_source source source 函数。
function ltn12_source_module.table(values) end

--- 创建可回退一个 chunk 的 source。
---@param src ltn12_source source 函数。
---@return fun(chunk?:string):string?, string? source source 函数。
function ltn12_source_module.rewind(src) end

--- 将 source 输出接入过滤器。
---@param src ltn12_source source 函数。
---@param filter ltn12_filter 过滤器。
---@param ... any 过滤器参数。
---@return ltn12_source source source 函数。
function ltn12_source_module.chain(src, filter, ...) end

--- 串联多个 source。
---@param ... ltn12_source source 函数。
---@return ltn12_source source source 函数。
function ltn12_source_module.cat(...) end

--- 将输出写入 table。
---@param values? string[] 接收列表。
---@return ltn12_sink sink sink 函数。
---@return string[] values 接收列表。
function ltn12_sink_module.table(values) end

--- 将输出写入文件句柄。
---@param handle file* 文件句柄。
---@param io_err? string 打开文件时的错误。
---@return ltn12_sink sink sink 函数。
function ltn12_sink_module.file(handle, io_err) end

--- 简化 sink 的错误处理。
---@param snk ltn12_sink sink 函数。
---@return ltn12_sink sink sink 函数。
function ltn12_sink_module.simplify(snk) end

--- 丢弃所有输出。
---@return ltn12_sink sink sink 函数。
function ltn12_sink_module.null() end

--- 总是返回错误的 sink。
---@param err string 错误信息。
---@return ltn12_sink sink sink 函数。
function ltn12_sink_module.error(err) end

--- 将过滤器输出接入 sink。
---@param filter ltn12_filter 过滤器。
---@param snk ltn12_sink sink 函数。
---@param ... any 过滤器参数。
---@return ltn12_sink sink sink 函数。
function ltn12_sink_module.chain(filter, snk, ...) end

--- 执行一步 pump。
---@param src ltn12_source source 函数。
---@param snk ltn12_sink sink 函数。
---@return boolean? ok 是否继续。
---@return string? errMsg 错误信息。
function ltn12_pump_module.step(src, snk) end

--- 持续 pump 到 source 结束。
---@param src ltn12_source source 函数。
---@param snk ltn12_sink sink 函数。
---@param step? ltn12_pump_step 自定义 step。
---@return boolean? ok 是否成功。
---@return string? errMsg 错误信息。
function ltn12_pump_module.all(src, snk, step) end

return M
