diff options
author | Louis Pilfold <louis@lpil.uk> | 2020-05-25 11:27:06 +0100 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-05-26 19:19:29 +0100 |
commit | 915f43cc7695e937b90d2c8b3107bc66dfab5baa (patch) | |
tree | 19ae83160297b1ee1e95f50da096aed7b3040f7e | |
parent | 52856a1f817c8f038ac82394f1fd40b1c93f7013 (diff) | |
download | gleam_stdlib-915f43cc7695e937b90d2c8b3107bc66dfab5baa.tar.gz gleam_stdlib-915f43cc7695e937b90d2c8b3107bc66dfab5baa.zip |
set.take
-rw-r--r-- | CHANGELOG.md | 3 | ||||
-rw-r--r-- | src/gleam/map.gleam | 6 | ||||
-rw-r--r-- | src/gleam/set.gleam | 37 | ||||
-rw-r--r-- | test/gleam/set_test.gleam | 17 |
4 files changed, 58 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index a6308c1..b06925a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ `from_list`, `fold`, `run`, `to_list`, `take`, `drop`, `map`, `filter`, `cycle`, and `range` functions. - Created the `set` module with the `new`, `insert`, `delete`, `to_list`, - `from_list`, `fold`, and `contains` functions. + `from_list`, `fold`, `take`, and `contains` functions. - Created the `io` module with the `print`, `println`, and `debug` functions. - Created the `queue` module with the `new`, `from_list`, `to_list`, `is_empty`, `length`, `push_back`, `push_front`, `pop_back`, `pop_front`, @@ -29,6 +29,7 @@ - The `list.sort` label `sort_by` has been changed to `by`. - The `list.fold`'s first argument gained the label `over`. - The `map.fold`'s first argument gained the label `over`. +- The `map.take`'s `drop` arguement has been changed to `keeping`. ## v0.8.0 - 2020-04-28 diff --git a/src/gleam/map.gleam b/src/gleam/map.gleam index e59a042..488a315 100644 --- a/src/gleam/map.gleam +++ b/src/gleam/map.gleam @@ -179,8 +179,8 @@ external fn erl_filter( /// > |> filter(fn(key, value) { True }) /// from_list([tuple("a", 0), tuple("b", 1)]) /// -pub fn filter(in map: Map(k, v), for predicate: fn(k, v) -> Bool) -> Map(k, v) { - erl_filter(predicate, map) +pub fn filter(in map: Map(k, v), for property: fn(k, v) -> Bool) -> Map(k, v) { + erl_filter(property, map) } external fn erl_take(List(k), Map(k, v)) -> Map(k, v) = @@ -199,7 +199,7 @@ external fn erl_take(List(k), Map(k, v)) -> Map(k, v) = /// > |> take(["a", "b", "c"]) /// from_list([tuple("a", 0), tuple("b", 1)]) /// -pub fn take(from map: Map(k, v), drop desired_keys: List(k)) -> Map(k, v) { +pub fn take(from map: Map(k, v), keeping desired_keys: List(k)) -> Map(k, v) { erl_take(desired_keys, map) } diff --git a/src/gleam/set.gleam b/src/gleam/set.gleam index d958919..ea0d5c6 100644 --- a/src/gleam/set.gleam +++ b/src/gleam/set.gleam @@ -132,3 +132,40 @@ pub fn fold( ) -> acc { map.fold(over: set.map, from: initial, with: fn(k, _, a) { reducer(k, a) }) } + +/// Create a new set from an existing set, minus any members that a given +/// function returns False for. +/// +/// This function runs in loglinear time. +/// +/// ## Examples +/// +/// > import gleam/int +/// > from_list([1, 4, 6, 3, 675, 44, 67]) +/// > |> filter(for: int.is_even) +/// > |> to_list +/// [4, 6, 44] +/// +pub fn filter( + in set: Set(member), + for property: fn(member) -> Bool, +) -> Set(member) { + Set(map.filter(in: set.map, for: fn(m, _) { property(m) })) +} + +/// Create a new map from a given map, only including any members which are in +/// a given list. +/// +/// This function runs in loglinear time. +/// +/// ## Examples +/// +/// > from_list([1, 2, 3]) |> take([1, 3, 5]) |> to_list +/// [1, 3] +/// +pub fn take( + from set: Set(member), + keeping desired: List(member), +) -> Set(member) { + Set(map.take(from: set.map, keeping: desired)) +} diff --git a/test/gleam/set_test.gleam b/test/gleam/set_test.gleam index b0f6ebd..efbdcfc 100644 --- a/test/gleam/set_test.gleam +++ b/test/gleam/set_test.gleam @@ -56,7 +56,7 @@ pub fn from_list_test() { |> set.from_list |> set.to_list |> list.sort(by: int.compare) - |> should.equal([1, 3, 3, 4]) + |> should.equal([1, 2, 3, 4]) } pub fn fold_test() { @@ -64,3 +64,18 @@ pub fn fold_test() { |> set.from_list |> set.fold(from: 0, with: fn(m, a) { m + a }) } + +pub fn filter_test() { + [1, 4, 6, 3, 675, 44, 67] + |> set.from_list() + |> set.filter(for: int.is_even) + |> set.to_list + |> should.equal([4, 6, 44]) +} + +pub fn take_test() { + [1, 2, 3] + |> set.from_list + |> set.take([1, 3, 5]) + |> should.equal(set.from_list([1, 3])) +} |