diff --git a/src/std/option/init.luau b/src/std/option/init.luau index acee516..56341d8 100644 --- a/src/std/option/init.luau +++ b/src/std/option/init.luau @@ -34,6 +34,14 @@ local function none(): None return NONE end +--- Constructs a new `None` value if the given value is `nil`, Otherwise returns `Some`. +local function from(value: T?): Some | None + return + if value ~= nil + then some(value) + else NONE +end + --- Returns `true` if the option is a `Some` value. function Option.is_some(self: Option): boolean return self._is_some @@ -206,4 +214,5 @@ return { is = is; some = some; none = none; + from = from; } \ No newline at end of file diff --git a/tests/std/option/.check.luau b/tests/std/option/.check.luau index bfef6b5..33346e6 100644 --- a/tests/std/option/.check.luau +++ b/tests/std/option/.check.luau @@ -35,3 +35,7 @@ local some: Option.Some = do_nothing(some_1) local none: Option.None = do_nothing(none_1) -- do_nothing(1) -- should error + +local some_or_none = Option.from(nil) +-- some = some_or_none -- should error +-- none = some_or_none -- should error \ No newline at end of file diff --git a/tests/std/option/.spec.luau b/tests/std/option/.spec.luau index 69a3e21..037f1ff 100644 --- a/tests/std/option/.spec.luau +++ b/tests/std/option/.spec.luau @@ -27,6 +27,15 @@ test.suite("std.option", function(suite) asserts.eq(Option.is("some"), false) end) + suite:case(".from", function(asserts) + asserts.eq(Option.from(1):is_some(), true) + asserts.eq(Option.from(1):is_none(), false) + asserts.eq(Option.from(nil):is_some(), false) + asserts.eq(Option.from(nil):is_none(), true) + asserts.eq(Option.is(Option.from(42)), true) + asserts.eq(Option.is(Option.from(nil)), true) + end) + suite:case(":is_some_and", function(asserts) local even = function(n: number) return n % 2 == 0 end