Skip to content

Commit 915f43c

Browse files
committed
set.take
1 parent 52856a1 commit 915f43c

File tree

4 files changed

+58
-5
lines changed

4 files changed

+58
-5
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
`from_list`, `fold`, `run`, `to_list`, `take`, `drop`, `map`, `filter`,
77
`cycle`, and `range` functions.
88
- Created the `set` module with the `new`, `insert`, `delete`, `to_list`,
9-
`from_list`, `fold`, and `contains` functions.
9+
`from_list`, `fold`, `take`, and `contains` functions.
1010
- Created the `io` module with the `print`, `println`, and `debug` functions.
1111
- Created the `queue` module with the `new`, `from_list`, `to_list`,
1212
`is_empty`, `length`, `push_back`, `push_front`, `pop_back`, `pop_front`,
@@ -29,6 +29,7 @@
2929
- The `list.sort` label `sort_by` has been changed to `by`.
3030
- The `list.fold`'s first argument gained the label `over`.
3131
- The `map.fold`'s first argument gained the label `over`.
32+
- The `map.take`'s `drop` arguement has been changed to `keeping`.
3233

3334
## v0.8.0 - 2020-04-28
3435

src/gleam/map.gleam

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ external fn erl_filter(
179179
/// > |> filter(fn(key, value) { True })
180180
/// from_list([tuple("a", 0), tuple("b", 1)])
181181
///
182-
pub fn filter(in map: Map(k, v), for predicate: fn(k, v) -> Bool) -> Map(k, v) {
183-
erl_filter(predicate, map)
182+
pub fn filter(in map: Map(k, v), for property: fn(k, v) -> Bool) -> Map(k, v) {
183+
erl_filter(property, map)
184184
}
185185

186186
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) =
199199
/// > |> take(["a", "b", "c"])
200200
/// from_list([tuple("a", 0), tuple("b", 1)])
201201
///
202-
pub fn take(from map: Map(k, v), drop desired_keys: List(k)) -> Map(k, v) {
202+
pub fn take(from map: Map(k, v), keeping desired_keys: List(k)) -> Map(k, v) {
203203
erl_take(desired_keys, map)
204204
}
205205

src/gleam/set.gleam

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,40 @@ pub fn fold(
132132
) -> acc {
133133
map.fold(over: set.map, from: initial, with: fn(k, _, a) { reducer(k, a) })
134134
}
135+
136+
/// Create a new set from an existing set, minus any members that a given
137+
/// function returns False for.
138+
///
139+
/// This function runs in loglinear time.
140+
///
141+
/// ## Examples
142+
///
143+
/// > import gleam/int
144+
/// > from_list([1, 4, 6, 3, 675, 44, 67])
145+
/// > |> filter(for: int.is_even)
146+
/// > |> to_list
147+
/// [4, 6, 44]
148+
///
149+
pub fn filter(
150+
in set: Set(member),
151+
for property: fn(member) -> Bool,
152+
) -> Set(member) {
153+
Set(map.filter(in: set.map, for: fn(m, _) { property(m) }))
154+
}
155+
156+
/// Create a new map from a given map, only including any members which are in
157+
/// a given list.
158+
///
159+
/// This function runs in loglinear time.
160+
///
161+
/// ## Examples
162+
///
163+
/// > from_list([1, 2, 3]) |> take([1, 3, 5]) |> to_list
164+
/// [1, 3]
165+
///
166+
pub fn take(
167+
from set: Set(member),
168+
keeping desired: List(member),
169+
) -> Set(member) {
170+
Set(map.take(from: set.map, keeping: desired))
171+
}

test/gleam/set_test.gleam

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,26 @@ pub fn from_list_test() {
5656
|> set.from_list
5757
|> set.to_list
5858
|> list.sort(by: int.compare)
59-
|> should.equal([1, 3, 3, 4])
59+
|> should.equal([1, 2, 3, 4])
6060
}
6161

6262
pub fn fold_test() {
6363
[1, 3, 9]
6464
|> set.from_list
6565
|> set.fold(from: 0, with: fn(m, a) { m + a })
6666
}
67+
68+
pub fn filter_test() {
69+
[1, 4, 6, 3, 675, 44, 67]
70+
|> set.from_list()
71+
|> set.filter(for: int.is_even)
72+
|> set.to_list
73+
|> should.equal([4, 6, 44])
74+
}
75+
76+
pub fn take_test() {
77+
[1, 2, 3]
78+
|> set.from_list
79+
|> set.take([1, 3, 5])
80+
|> should.equal(set.from_list([1, 3]))
81+
}

0 commit comments

Comments
 (0)