aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lua/mason-core/optional.lua10
-rw-r--r--tests/mason-core/optional_spec.lua45
2 files changed, 55 insertions, 0 deletions
diff --git a/lua/mason-core/optional.lua b/lua/mason-core/optional.lua
index cc40da77..d5055c9c 100644
--- a/lua/mason-core/optional.lua
+++ b/lua/mason-core/optional.lua
@@ -62,6 +62,16 @@ function Optional:or_else_get(supplier)
end
end
+---@param supplier fun(value: any): Optional
+---@return Optional
+function Optional:and_then(supplier)
+ if self:is_present() then
+ return supplier(self._value)
+ else
+ return self
+ end
+end
+
---@param supplier fun(): Optional
---@return Optional
function Optional:or_(supplier)
diff --git a/tests/mason-core/optional_spec.lua b/tests/mason-core/optional_spec.lua
index b1a4f41a..fed6deba 100644
--- a/tests/mason-core/optional_spec.lua
+++ b/tests/mason-core/optional_spec.lua
@@ -92,3 +92,48 @@ describe("Optional.ok_or()", function()
assert.equals("I'm empty.", result:err_or_nil())
end)
end)
+
+describe("Optional.or_()", function()
+ it("should run supplier if value is not present", function()
+ local spy = spy.new(function()
+ return Optional.of "Hello world!"
+ end)
+ assert.same(Optional.of "Hello world!", Optional.empty():or_(spy))
+ assert.spy(spy).was_called(1)
+
+ assert.same(Optional.empty(), Optional.empty():or_(Optional.empty))
+ end)
+
+ it("should not run supplier if value is present", function()
+ local spy = spy.new(function()
+ return Optional.of "Hello world!"
+ end)
+ assert.same(Optional.of "Hello world!", Optional.of("Hello world!"):or_(spy))
+ assert.spy(spy).was_called(0)
+ end)
+end)
+
+describe("Optional.and_then()", function()
+ it("should run supplier if value is present", function()
+ local spy = spy.new(function(value)
+ return Optional.of(("%s world!"):format(value))
+ end)
+ assert.same(Optional.of "Hello world!", Optional.of("Hello"):and_then(spy))
+ assert.spy(spy).was_called(1)
+
+ assert.same(
+ Optional.empty(),
+ Optional.empty():and_then(function()
+ return Optional.of "Nothing."
+ end)
+ )
+ end)
+
+ it("should not run supplier if value is not present", function()
+ local spy = spy.new(function()
+ return Optional.of "Hello world!"
+ end)
+ assert.same(Optional.empty(), Optional.empty():and_then(spy))
+ assert.spy(spy).was_called(0)
+ end)
+end)