<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.iccup.org/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AResultOrError</id>
	<title>Модуль:ResultOrError - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.iccup.org/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AResultOrError"/>
	<link rel="alternate" type="text/html" href="https://wiki.iccup.org/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:ResultOrError&amp;action=history"/>
	<updated>2026-05-31T06:04:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.iccup.org/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:ResultOrError&amp;diff=784&amp;oldid=prev</id>
		<title>DarkMuse: Новая страница: «--- -- @iCCup -- wiki=commons -- page=Module:ResultOrError -- -- Please see https://github.com/iCCup/Lua-Modules to contribute --  local Class = require(&#039;Module:Class&#039;) local Error = require(&#039;Module:Error&#039;)  --  Класс ResultOrError представляет результат или ошибку. Он используется для обработки исхода функции, которая может выбросить ошибку.  ---@class R...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.iccup.org/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:ResultOrError&amp;diff=784&amp;oldid=prev"/>
		<updated>2024-09-24T18:34:05Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «--- -- @iCCup -- wiki=commons -- page=Module:ResultOrError -- -- Please see https://github.com/iCCup/Lua-Modules to contribute --  local Class = require(&amp;#039;Module:Class&amp;#039;) local Error = require(&amp;#039;Module:Error&amp;#039;)  --&lt;a href=&quot;/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81_ResultOrError_%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D1%82_%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82_%D0%B8%D0%BB%D0%B8_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D1%83._%D0%9E%D0%BD_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82%D1%81%D1%8F_%D0%B4%D0%BB%D1%8F_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%B0_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8,_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B6%D0%B5%D1%82_%D0%B2%D1%8B%D0%B1%D1%80%D0%BE%D1%81%D0%B8%D1%82%D1%8C_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D1%83.&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Класс ResultOrError представляет результат или ошибку. Он используется для обработки исхода функции, которая может выбросить ошибку. (страница не существует)&quot;&gt;Класс ResultOrError представляет результат или ошибку. Он используется для обработки исхода функции, которая может выбросить ошибку. &lt;/a&gt; ---@class R...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;---&lt;br /&gt;
-- @iCCup&lt;br /&gt;
-- wiki=commons&lt;br /&gt;
-- page=Module:ResultOrError&lt;br /&gt;
--&lt;br /&gt;
-- Please see https://github.com/iCCup/Lua-Modules to contribute&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local Class = require(&amp;#039;Module:Class&amp;#039;)&lt;br /&gt;
local Error = require(&amp;#039;Module:Error&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
Класс ResultOrError представляет результат или ошибку.&lt;br /&gt;
Он используется для обработки исхода функции, которая может выбросить ошибку.&lt;br /&gt;
]]&lt;br /&gt;
---@class ResultOrError: BaseClass&lt;br /&gt;
local ResultOrError = Class.new(function(self)&lt;br /&gt;
    -- ResultOrError является абстрактным классом.&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
-- Применяет функцию к результату или обрабатывает ошибку.&lt;br /&gt;
---@param f? fun(any: any): any&lt;br /&gt;
---@param onError? fun(error: Error?): any&lt;br /&gt;
---@return ResultOrError&lt;br /&gt;
function ResultOrError:map(f, onError) error(&amp;#039;Abstract method&amp;#039;) end&lt;br /&gt;
&lt;br /&gt;
-- Возвращает результат или выбрасывает ошибку&lt;br /&gt;
---@return any&lt;br /&gt;
function ResultOrError:get() error(&amp;#039;Abstract method&amp;#039;) end&lt;br /&gt;
&lt;br /&gt;
---@param onError fun(error: Error?): any&lt;br /&gt;
---@return ResultOrError&lt;br /&gt;
function ResultOrError:catch(onError)&lt;br /&gt;
    return self:map(nil, onError)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param f fun(error: Error?): any&lt;br /&gt;
---@return ResultOrError&lt;br /&gt;
function ResultOrError:finally(f)&lt;br /&gt;
    local ret = self:map(f, f)&lt;br /&gt;
    if ret:isError() then&lt;br /&gt;
        return ret&lt;br /&gt;
    end&lt;br /&gt;
    return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@return boolean&lt;br /&gt;
function ResultOrError:isResult()&lt;br /&gt;
    return Class.instanceOf(self, ResultOrError.Result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@return boolean&lt;br /&gt;
function ResultOrError:isError()&lt;br /&gt;
    return Class.instanceOf(self, ResultOrError.Error)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
Кейс с результатом &lt;br /&gt;
]]&lt;br /&gt;
---@class RoEResult: ResultOrError&lt;br /&gt;
---@field result any&lt;br /&gt;
ResultOrError.Result = Class.new(ResultOrError, function(self, result)&lt;br /&gt;
    self.result = result&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
---@param f? fun(any: any): any&lt;br /&gt;
---@param _ any&lt;br /&gt;
---@return RoEResult|RoEError&lt;br /&gt;
function ResultOrError.Result:map(f, _)&lt;br /&gt;
    return f&lt;br /&gt;
        and ResultOrError.try(function() return f(self.result) end)&lt;br /&gt;
        or self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@return any&lt;br /&gt;
function ResultOrError.Result:get()&lt;br /&gt;
    return self.result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
Кейс с ошибкой &lt;br /&gt;
]]&lt;br /&gt;
---@class RoEError: ResultOrError&lt;br /&gt;
---@field error Error&lt;br /&gt;
ResultOrError.Error = Class.new(ResultOrError, function(self, error)&lt;br /&gt;
    self.error = error&lt;br /&gt;
end)&lt;br /&gt;
&lt;br /&gt;
---@param _ any&lt;br /&gt;
---@param onError? fun(error: Error?): any&lt;br /&gt;
---@return RoEResult|RoEError&lt;br /&gt;
function ResultOrError.Error:map(_, onError)&lt;br /&gt;
    return onError&lt;br /&gt;
        and ResultOrError.try(function() return onError(self.error) end, self.error)&lt;br /&gt;
        or ResultOrError.Result()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@return any&lt;br /&gt;
function ResultOrError.Error:get()&lt;br /&gt;
    error(self.error)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
Вызывает функцию и помещает результат или ошибку в ResultOrError.&lt;br /&gt;
Если результат является экземпляром ResultOrError, то он &amp;quot;разворачивается&amp;quot;.&lt;br /&gt;
]]&lt;br /&gt;
---@param f fun(): any&lt;br /&gt;
---@param originalError table?&lt;br /&gt;
---@return RoEResult|RoEError&lt;br /&gt;
function ResultOrError.try(f, originalError)&lt;br /&gt;
    local resultOrError&lt;br /&gt;
    xpcall(&lt;br /&gt;
        function()&lt;br /&gt;
            local result = f()&lt;br /&gt;
            local isResultOrError = Class.instanceOf(result, ResultOrError)&lt;br /&gt;
            resultOrError = isResultOrError&lt;br /&gt;
                and result&lt;br /&gt;
                or ResultOrError.Result(result)&lt;br /&gt;
        end,&lt;br /&gt;
        function(any)&lt;br /&gt;
            local error = Error.isError(any) and any or Error(any)&lt;br /&gt;
&lt;br /&gt;
            if originalError and error ~= originalError then&lt;br /&gt;
                if type(error.originalErrors) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
                    error.originalErrors = {}&lt;br /&gt;
                end&lt;br /&gt;
                table.insert(error.originalErrors, originalError)&lt;br /&gt;
            elseif not error.noStack then&lt;br /&gt;
                if type(error.stacks) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
                    error.stacks = {}&lt;br /&gt;
                end&lt;br /&gt;
                table.insert(error.stacks, 1, debug.traceback())&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            resultOrError = ResultOrError.Error(error)&lt;br /&gt;
        end&lt;br /&gt;
    )&lt;br /&gt;
    return resultOrError&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
Если все входные ResultOrError — результаты, то возвращается массив результатов.&lt;br /&gt;
В противном случае возвращается первая ошибка.&lt;br /&gt;
]]&lt;br /&gt;
---@param resultOrErrors ResultOrError[]&lt;br /&gt;
---@return RoEResult|RoEError&lt;br /&gt;
function ResultOrError.all(resultOrErrors)&lt;br /&gt;
    local results = {}&lt;br /&gt;
    for _, resultOrError in ipairs(resultOrErrors) do&lt;br /&gt;
        if resultOrError:isResult() then&lt;br /&gt;
            table.insert(results, resultOrError.result)&lt;br /&gt;
        else&lt;br /&gt;
            return resultOrError&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return ResultOrError.Result(results)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
Если хотя бы один из входных ResultOrError — результат, то возвращается первый такой.&lt;br /&gt;
Иначе возвращается совокупная ошибка из всех ошибок.&lt;br /&gt;
]]&lt;br /&gt;
---@param resultOrErrors ResultOrError[]&lt;br /&gt;
---@return RoEResult|RoEError&lt;br /&gt;
function ResultOrError.any(resultOrErrors)&lt;br /&gt;
    local errors = {}&lt;br /&gt;
    for _, resultOrError in ipairs(resultOrErrors) do&lt;br /&gt;
        if resultOrError:isResult() then&lt;br /&gt;
            return resultOrError&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(errors, resultOrError.error)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local error = {&lt;br /&gt;
        childErrors = errors,&lt;br /&gt;
        message = table.concat(errors, &amp;#039;\n&amp;#039;),&lt;br /&gt;
        stacks = {debug.traceback()},&lt;br /&gt;
    }&lt;br /&gt;
    return ResultOrError.Error(error)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return ResultOrError&lt;/div&gt;</summary>
		<author><name>DarkMuse</name></author>
	</entry>
</feed>