From 75a5d752341cef2e35ec82752ab9b34539dba2a4 Mon Sep 17 00:00:00 2001 From: Ahmad Sattar Date: Wed, 17 Jun 2020 22:12:52 +0200 Subject: Option map function --- CHANGELOG.md | 1 + src/gleam/option.gleam | 21 +++++++++++++++++++++ test/gleam/option_test.gleam | 14 ++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e750c3..8918f8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - The `dynamic.tuple2_of` function has been renamed to `dynamic.typed_tuple2`. - The `list.traverse` function has been renamed to `list.try_map`. - The `list.traverse` first argument gains the label `over`. +- Added the `map` function to the the `option` module. ## 0.9.0 - 2020-05-26 diff --git a/src/gleam/option.gleam b/src/gleam/option.gleam index 663cd1f..46327ed 100644 --- a/src/gleam/option.gleam +++ b/src/gleam/option.gleam @@ -85,3 +85,24 @@ pub fn unwrap(option: Option(a), or default: a) -> a { None -> default } } + +/// Update 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 + } +} diff --git a/test/gleam/option_test.gleam b/test/gleam/option_test.gleam index e41c221..edbb569 100644 --- a/test/gleam/option_test.gleam +++ b/test/gleam/option_test.gleam @@ -40,3 +40,17 @@ pub fn unwrap_option_test() { option.unwrap(None, 0) |> should.equal(0) } + +pub fn map_option_test() { + Some(1) + |> option.map(fn(x) { x + 1 }) + |> should.equal(Some(2)) + + Some(1) + |> option.map(fn(x) { "2" }) + |> should.equal(Some("2")) + + None + |> option.map(fn(x) { x + 1 }) + |> should.equal(None) +} -- cgit v1.2.3