diff options
author | Louis Pilfold <louis@lpil.uk> | 2021-07-19 21:35:08 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2021-07-19 21:35:08 +0100 |
commit | d2ff5bec0c60fc748aa8c5c7ef7793430e1b1db2 (patch) | |
tree | d1195e087e00db6caeec78f7aa6d0f251a7c073c /src | |
parent | 63e680d27cee5516a5b33b6c8c5099846c3bf69f (diff) | |
download | gleam_stdlib-d2ff5bec0c60fc748aa8c5c7ef7793430e1b1db2.tar.gz gleam_stdlib-d2ff5bec0c60fc748aa8c5c7ef7793430e1b1db2.zip |
JS option module
Diffstat (limited to 'src')
-rw-r--r-- | src/gleam/option.gleam | 412 |
1 files changed, 205 insertions, 207 deletions
diff --git a/src/gleam/option.gleam b/src/gleam/option.gleam index feb6f56..f72f552 100644 --- a/src/gleam/option.gleam +++ b/src/gleam/option.gleam @@ -1,227 +1,225 @@ -if erlang { - import gleam/list +import gleam/list - /// Option represents a value that may be present or not. Some means the value is - /// present, None means the value is not. - /// - /// This is Gleam's alternative to having a value that could be Null, as is - /// possible in some other languages. - /// - pub type Option(a) { - Some(a) - None - } +/// Option represents a value that may be present or not. Some means the value is +/// present, None means the value is not. +/// +/// This is Gleam's alternative to having a value that could be Null, as is +/// possible in some other languages. +/// +pub type Option(a) { + Some(a) + None +} - /// Combines a list of options into a single option. - /// If all elements in the list are Some then returns a Some holding the list of values. - /// If any element is None then returns None. - /// - /// ## Examples - /// - /// ``` - /// > all([Some(1), Some(2)]) - /// Some([1, 2]) - /// - /// > all([Some(1), None]) - /// None - /// ``` - /// - pub fn all(list: List(Option(a))) -> Option(List(a)) { - list.fold_right( - list, - from: Some([]), - with: fn(item, acc) { - case acc, item { - Some(values), Some(value) -> Some([value, ..values]) - _, _ -> None - } - }, - ) - } +/// Combines a list of options into a single option. +/// If all elements in the list are Some then returns a Some holding the list of values. +/// If any element is None then returns None. +/// +/// ## Examples +/// +/// ``` +/// > all([Some(1), Some(2)]) +/// Some([1, 2]) +/// +/// > all([Some(1), None]) +/// None +/// ``` +/// +pub fn all(list: List(Option(a))) -> Option(List(a)) { + list.fold_right( + list, + from: Some([]), + with: fn(item, acc) { + case acc, item { + Some(values), Some(value) -> Some([value, ..values]) + _, _ -> None + } + }, + ) +} - /// Checks whether the option is a Some value. - /// - /// ## Examples - /// - /// > is_some(Some(1)) - /// True - /// - /// > is_some(None) - /// False - /// - pub fn is_some(option: Option(a)) -> Bool { - option != None - } +/// Checks whether the option is a Some value. +/// +/// ## Examples +/// +/// > is_some(Some(1)) +/// True +/// +/// > is_some(None) +/// False +/// +pub fn is_some(option: Option(a)) -> Bool { + option != None +} - /// Checks whether the option is a None value. - /// - /// ## Examples - /// - /// > is_none(Some(1)) - /// False - /// - /// > is_none(None) - /// True - /// - pub fn is_none(option: Option(a)) -> Bool { - option == None - } +/// Checks whether the option is a None value. +/// +/// ## Examples +/// +/// > is_none(Some(1)) +/// False +/// +/// > is_none(None) +/// True +/// +pub fn is_none(option: Option(a)) -> Bool { + option == None +} - /// Converts an Option type to a Result type - /// - /// ## Examples - /// - /// > to_result(Some(1), "some_error") - /// Ok(1) - /// > to_result(None, "some_error") - /// Error("some_error") - /// - pub fn to_result(option: Option(a), e) -> Result(a, e) { - case option { - Some(a) -> Ok(a) - _ -> Error(e) - } +/// Converts an Option type to a Result type +/// +/// ## Examples +/// +/// > to_result(Some(1), "some_error") +/// Ok(1) +/// > to_result(None, "some_error") +/// Error("some_error") +/// +pub fn to_result(option: Option(a), e) -> Result(a, e) { + case option { + Some(a) -> Ok(a) + _ -> Error(e) } +} - /// Converts a Result type to an Option type - /// - /// ## Examples - /// - /// > from_result(Ok(1)) - /// Some(1) - /// > from_result(Error"some_error")) - /// None - /// - pub fn from_result(result: Result(a, e)) -> Option(a) { - case result { - Ok(a) -> Some(a) - _ -> None - } +/// Converts a Result type to an Option type +/// +/// ## Examples +/// +/// > from_result(Ok(1)) +/// Some(1) +/// > from_result(Error"some_error")) +/// None +/// +pub fn from_result(result: Result(a, e)) -> Option(a) { + case result { + Ok(a) -> Some(a) + _ -> None } +} - /// Extracts the value from an option, returning a default value if there is none. - /// - /// ## Examples - /// - /// > unwrap(Some(1), 0) - /// 1 - /// - /// > unwrap(None, 0) - /// 0 - /// - pub fn unwrap(option: Option(a), or default: a) -> a { - case option { - Some(x) -> x - None -> default - } +/// Extracts the value from an option, returning a default value if there is none. +/// +/// ## Examples +/// +/// > unwrap(Some(1), 0) +/// 1 +/// +/// > unwrap(None, 0) +/// 0 +/// +pub fn unwrap(option: Option(a), or default: a) -> a { + case option { + Some(x) -> x + None -> default } +} - /// Updates a value held within the Some of an Option by calling a given function - /// on it. - /// - /// If the option is a None rather than Some the function is not called and the - /// option stays the same. - /// - /// ## Examples - /// - /// > map(over: Some(1), with: fn(x) { x + 1 }) - /// Some(2) - /// - /// > map(over: None, with: fn(x) { x + 1 }) - /// None - /// - pub fn map(over option: Option(a), with fun: fn(a) -> b) -> Option(b) { - case option { - Some(x) -> Some(fun(x)) - None -> None - } +/// Updates a value held within the Some of an Option by calling a given function +/// on it. +/// +/// If the option is a None rather than Some the function is not called and the +/// option stays the same. +/// +/// ## Examples +/// +/// > map(over: Some(1), with: fn(x) { x + 1 }) +/// Some(2) +/// +/// > map(over: None, with: fn(x) { x + 1 }) +/// None +/// +pub fn map(over option: Option(a), with fun: fn(a) -> b) -> Option(b) { + case option { + Some(x) -> Some(fun(x)) + None -> None } +} - /// Merges a nested Option into a single layer. - /// - /// ## Examples - /// - /// > flatten(Some(Some(1))) - /// Some(1) - /// - /// > flatten(Some(None)) - /// None - /// - /// > flatten(None) - /// None - /// - pub fn flatten(option: Option(Option(a))) -> Option(a) { - case option { - Some(x) -> x - None -> None - } +/// Merges a nested Option into a single layer. +/// +/// ## Examples +/// +/// > flatten(Some(Some(1))) +/// Some(1) +/// +/// > flatten(Some(None)) +/// None +/// +/// > flatten(None) +/// None +/// +pub fn flatten(option: Option(Option(a))) -> Option(a) { + case option { + Some(x) -> x + None -> None } +} - /// Updates a value held within the Some of an Option by calling a given function - /// on it, where the given function also returns an Option. The two Options are - /// then merged together into one Option. - /// - /// If the Option is a None rather than Some the function is not called and the - /// Option stays the same. - /// - /// This function is the equivalent of calling `map` followed by `flatten`, and - /// it is useful for chaining together multiple functions that return Options. - /// - /// ## Examples - /// - /// > then(Some(1), fn(x) { Some(x + 1) }) - /// Some(2) - /// - /// > then(Some(1), fn(x) { Some(#("a", x)) }) - /// Some(#("a", 1)) - /// - /// > then(Some(1), fn(x) { None }) - /// None - /// - /// > then(None, fn(x) { Some(x + 1) }) - /// None - /// - pub fn then(option: Option(a), apply fun: fn(a) -> Option(b)) -> Option(b) { - case option { - Some(x) -> fun(x) - None -> None - } +/// Updates a value held within the Some of an Option by calling a given function +/// on it, where the given function also returns an Option. The two Options are +/// then merged together into one Option. +/// +/// If the Option is a None rather than Some the function is not called and the +/// Option stays the same. +/// +/// This function is the equivalent of calling `map` followed by `flatten`, and +/// it is useful for chaining together multiple functions that return Options. +/// +/// ## Examples +/// +/// > then(Some(1), fn(x) { Some(x + 1) }) +/// Some(2) +/// +/// > then(Some(1), fn(x) { Some(#("a", x)) }) +/// Some(#("a", 1)) +/// +/// > then(Some(1), fn(x) { None }) +/// None +/// +/// > then(None, fn(x) { Some(x + 1) }) +/// None +/// +pub fn then(option: Option(a), apply fun: fn(a) -> Option(b)) -> Option(b) { + case option { + Some(x) -> fun(x) + None -> None } +} - /// Returns the first value if it is Some, otherwise return the second value. - /// - /// ## Examples - /// - /// > or(Some(1), Some(2)) - /// Some(1) - /// - /// > or(Some(1), None) - /// Some(1) - /// - /// > or(None, Some(2)) - /// Some(2) - /// - /// > or(None, None) - /// None - /// - pub fn or(first: Option(a), second: Option(a)) -> Option(a) { - case first { - Some(_) -> first - None -> second - } +/// Returns the first value if it is Some, otherwise return the second value. +/// +/// ## Examples +/// +/// > or(Some(1), Some(2)) +/// Some(1) +/// +/// > or(Some(1), None) +/// Some(1) +/// +/// > or(None, Some(2)) +/// Some(2) +/// +/// > or(None, None) +/// None +/// +pub fn or(first: Option(a), second: Option(a)) -> Option(a) { + case first { + Some(_) -> first + None -> second } +} - /// Given a list of options - /// Return only the values inside Some - /// - /// ## Examples - /// - /// ``` - /// > values([Some(1), None, Some(3)]) - /// [1, 3] - /// ``` - /// - pub fn values(options: List(Option(a))) -> List(a) { - list.filter_map(options, fn(op) { to_result(op, "") }) - } +/// Given a list of options +/// Return only the values inside Some +/// +/// ## Examples +/// +/// ``` +/// > values([Some(1), None, Some(3)]) +/// [1, 3] +/// ``` +/// +pub fn values(options: List(Option(a))) -> List(a) { + list.filter_map(options, fn(op) { to_result(op, "") }) } |