aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/core/optional.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-03-26 13:41:50 +0100
committerGitHub <noreply@github.com>2022-03-26 13:41:50 +0100
commit212d17a039da449043b67529c29851db37acc236 (patch)
tree38411b14487895cef0d7648e198b79fd28793fe6 /lua/nvim-lsp-installer/core/optional.lua
parentrun autogen_metadata.lua (diff)
downloadmason-212d17a039da449043b67529c29851db37acc236.tar
mason-212d17a039da449043b67529c29851db37acc236.tar.gz
mason-212d17a039da449043b67529c29851db37acc236.tar.bz2
mason-212d17a039da449043b67529c29851db37acc236.tar.lz
mason-212d17a039da449043b67529c29851db37acc236.tar.xz
mason-212d17a039da449043b67529c29851db37acc236.tar.zst
mason-212d17a039da449043b67529c29851db37acc236.zip
add async managers (#536)
Diffstat (limited to 'lua/nvim-lsp-installer/core/optional.lua')
-rw-r--r--lua/nvim-lsp-installer/core/optional.lua90
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