diff options
Diffstat (limited to 'lua/nvim-lsp-installer/core/optional.lua')
| -rw-r--r-- | lua/nvim-lsp-installer/core/optional.lua | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/lua/nvim-lsp-installer/core/optional.lua b/lua/nvim-lsp-installer/core/optional.lua new file mode 100644 index 00000000..d37a7e69 --- /dev/null +++ b/lua/nvim-lsp-installer/core/optional.lua @@ -0,0 +1,90 @@ +---@class Optional +---@field private _value unknown +local Optional = {} +Optional.__index = Optional + +---@param value any +function Optional.new(value) + return setmetatable({ _value = value }, Optional) +end + +local EMPTY = Optional.new(nil) + +---@param value any +function Optional.of_nilable(value) + if value == nil then + return EMPTY + else + return Optional.new(value) + end +end + +function Optional.empty() + return EMPTY +end + +---@param value any +function Optional.of(value) + return Optional.new(value) +end + +---@param mapper_fn fun(value: any): any +function Optional:map(mapper_fn) + if self:is_present() then + return Optional.of_nilable(mapper_fn(self._value)) + else + return EMPTY + end +end + +function Optional:get() + if not self:is_present() then + error("No value present.", 2) + end + return self._value +end + +---@param value any +function Optional:or_else(value) + if self:is_present() then + return self._value + else + return value + end +end + +---@param supplier fun(): Optional +function Optional:when_empty(supplier) + if self:is_present() then + return self._value + else + return supplier() + end +end + +---@param exception any @(optional) The exception to throw if the result is a failure. +function Optional:or_else_throw(exception) + if self:is_present() then + return self._value + else + if exception then + error(exception, 2) + else + error("No value present.", 2) + end + end +end + +---@param fn fun(value: any) +function Optional:if_present(fn) + if self:is_present() then + fn(self._value) + end + return self +end + +function Optional:is_present() + return self._value ~= nil +end + +return Optional |
