diff options
| -rw-r--r-- | lua/mason-core/optional.lua | 10 | ||||
| -rw-r--r-- | tests/mason-core/optional_spec.lua | 45 |
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) |
