Skip to content

option ​

View Source

The option package provides the Option<T...> type, which is a type that represents a value that may or may not exist, akin to T | nil.

This is useful to avoid nil-related bugs, which can cause bugs that are hard to track down.

This utility is inspired by the Option type in Rust.

Installation ​

Learn more about installation.

toml
[dependencies]
option = "lukadev-0/option@1.2.1"
sh
pesde add lukadev_0/option@1.2.1

Immutability ​

The Option type is immutable, meaning that once an Option is created, it cannot be modified.

However, the value inside the Option may be mutable, so it is important to be aware of this when working with Option values.

Static Properties ​

Option.None ​

lua
Option.None: Option<...any>

The option that does not contain a value.

Example ​

lua
local none = Option.None
assert(none:isNone())

Static Functions ​

Option.Some ​

lua
function Option.Some<T...>(T...): Option<T...>

Creates a new Some with the given values. You must provide at least one value, otherwise an error will be thrown.

Example ​

lua
local some = Option.Some(5, "foo", true)
assert(some:isSome())

Option.from ​

lua
function Option.from<T>(value: T?): Option<T>

Creates a new Option from the given value. If the value is nil, it returns None, otherwise it returns Some.

Example ​

lua
local some = Option.from(5)
assert(some == Option.Some(5))

local none = Option.from(nil)
assert(none == Option.None)

Option.is ​

lua
function Option.is(value: any): boolean

Returns true if the given value is an Option, otherwise it returns false.

Example ​

lua
local some = Option.Some(5)
assert(Option.is(some))
assert(Option.is(5) == false)

Instance Functions ​

Option:isSome ​

lua
function Option:isSome(): boolean

Returns true if the Option is a Some, otherwise it returns false.

Example ​

lua
local some = Option.Some(5)
assert(some:isSome())

Option:isSomeAnd ​

lua
function Option:isSomeAnd(f: (T...) -> boolean): boolean

Returns true if the Option is a Some and the values satisfies the given predicate, otherwise it returns false.

Example ​

lua
local some = Option.Some(5)
assert(some:isSomeAnd(function(value)
  return value > 0
end))

Option:isNone ​

lua
function Option:isNone(): boolean

Returns true if the Option is a None, otherwise it returns false.

Example ​

lua
local none = Option.None
assert(none:isNone())

Option:expect ​

lua
function Option:expect(message: string): T

Returns the value of the option if it is a Some, otherwise it throws an error with the given message.

THROWS

This function may throw an error.

Example ​

lua
local some = Option.Some(5)
assert(some:expect("expected a value") == 5)

local none = Option.None
none:expect("expected a value") -- throws "expected a value"

Option:unwrap ​

lua
function Option:unwrap(): T

Returns the value of the option if it is a Some, otherwise it throws an error.

THROWS

This function may throw an error.

Example ​

lua
local some = Option.Some(5)
assert(some:unwrap() == 5)

local none = Option.None
none:unwrap() -- throws "called `Option.unwrap()` on a `None` value"

Option:unwrapOr ​

lua
function Option:unwrapOr(T...): T...

Returns the value of the option if it is a Some, otherwise it returns the given default values.

Example ​

lua
local some = Option.Some(5)
assert(some:unwrapOr(10) == 5)

local none = Option.None
assert(none:unwrapOr(10) == 10)

Option:unwrapOrElse ​

lua
function Option:unwrapOrElse(f: () -> T...): T...

Returns the values of the option if it is a Some, otherwise it returns the result of the given function.

Example ​

lua
local some = Option.Some(5)
assert(some:unwrapOrElse(function()
  return 10
end) == 5)

Option:unwrapOrNil ​

lua
function Option:unwrapOrNil(): T?

Returns the value of the option if it is a Some, otherwise it returns nil. Only works if the option contains a single value, any other values are ignored.

Example ​

lua
local some = Option.Some(5)
assert(some:unwrapOrNil() == 5)

local none = Option.None
assert(none:unwrapOrNil() == nil)

Option:map ​

lua
function Option:map<U...>(f: (T...) -> U...): Option<U...>

Returns the result of the given function wrapped in an Option if the option is Some, otherwise returns None.

Example ​

lua
local some = Option.Some(5)
local double = some:map(function(value)
  return value * 2
end)

assert(double == Option.Some(10))

Option:mapOr ​

lua
function Option:mapOr<U>(default: U, f: (T...) -> U): U

Returns the result of the given function if the option is Some, otherwise returns the given default value. The result may only contain one value, if you need multiple values, use mapOrRest.

Example ​

lua
local some = Option.Some(5)
assert(some:mapOr(15, function(value)
  return value * 2
end) == 10)

local none = Option.None
assert(none:mapOr(15, function(value)
  return value * 2
end) == 15)

Option:mapOrRest ​

lua
function Option:mapOrRest<U...>(f: (T...) -> U..., U...): U...

Returns the result of the given function if the option is Some, otherwise returns the given default values.

This is equivalent to mapOr but allows for multiple return values. The default values are provided after the function.

Option:mapOrElse ​

lua
function Option:mapOrElse<U...>(default: () -> U..., f: (T...) -> U...): U...

Returns the result of the given function if the option is Some, otherwise returns the result of calling the default function.

Example ​

lua
local none = Option.None
assert(none:mapOrElse(function()
  return 15
end, function(value)
  return value * 2
end) == 10)

Option:andOpt ​

lua
function Option:andOpt<U...>(other: Option<U...>): Option<U...>

Returns None if the option is None, otherwise returns the other option.

Example ​

lua
local some = Option.Some(5)
local other = Option.Some(10)
assert(some:andOpt(other) == other)

local none = Option.None
assert(none:andOpt(other) == none)

Option:andThen ​

lua
function Option:andThen<U...>(f: (T...) -> Option<U...>): Option<U...>

Returns None if the option is None, otherwise returns the result of the given function.

Examples ​

lua
local some = Option.Some(5)
local double = some:andThen(function(value)
  return Option.Some(value * 2)
end)

assert(double == Option.Some(10))

Option:filter ​

lua
function Option:filter(f: (T...) -> boolean): Option<T>

Returns None if the option is None, otherwise calls the function with the values:

  • if the function returns true, returns the original option
  • if the function returns false, returns None

Examples ​

lua
local some = Option.Some(5)
local filtered = some:filter(function(value)
  return value > 0
end)

assert(filtered == some)

Option:orOpt ​

lua
function Option:orOpt(other: Option<T...>): Option<T...>

Returns the option if it is Some, otherwise returns the other option.

Example ​

lua
local some = Option.Some(5)

assert(some:orOpt(Option.Some(10)) == some)
assert(some:orOpt(Option.None) == some)

local none = Option.None
assert(none:orOpt(Option.Some(10)) == Option.Some(10))
assert(none:orOpt(Option.None) == none)

Option:orElse ​

lua
function Option:orElse(f: () -> Option<T...>): Option<T...>

Returns the option if it is Some, otherwise returns the result of calling the given function.

Example ​

lua
local some = Option.Some(5)
assert(some:orElse(function()
  return Option.Some(10)
end) == some)

Option:xor ​

lua
function Option:xor(other: Option<T...>): Option<T...>

Returns None if both options are Some or None, otherwise returns the option.

Example ​

lua
local some = Option.Some(5)
local other = Option.Some(10)

assert(some:xor(other) == Option.None)

Option:match ​

lua
function Option:match<U...>(f: {
  Some: (T...) -> U...,
  None: () -> U...
}): U...

Takes a table containing a Some and None function. If the option is a Some, calls the Some function with the values of the option, otherwise calls the None function. The result of the function call is returned.

Example ​

lua
local some = Option.Some(5)

local result = some:match({
  Some = function(value)
    return value * 2
  end,
  None = function()
    return 20
  end
})

assert(result == 10)

Option:join ​

lua
function Option:join<U...>(other: Option<U...>): Option<(T..., U...)>

Joins the values of two options into a single option. If both options are Some, the values are joined into a single Some, otherwise None is returned.

Example ​

lua
local some = Option.Some(1, 2)
local other = Option.Some(3, 4)

assert(some:join(other) == Option.Some(1, 2, 3, 4))

Metamethods ​

Option:__tostring ​

lua
function Option:__tostring(): string

Called when tostring() is called on the Option.

Converts the Option to a string. The format of the returned string may change and should not be relied upon.

Example ​

lua
local some = Option.Some(5)
assert(tostring(some) == "Option::Some(5)")

local none = Option.None
assert(tostring(none) == "Option::None")

Option:__eq ​

lua
function Option:__eq(other: Option<T>): boolean

Called when the == operator is used on the Option.

Returns true if both options are Some and their values are equal, or if both options are None, otherwise returns false.

Example ​

lua
local some = Option.Some(5)
local other = Option.Some(5)

assert(some == other)

Released under the MIT License.