Skip to content

Commit cdbb06e

Browse files
committed
fix(sorted_map): change the return type of keys and values to Iter
1 parent 3d9e2b2 commit cdbb06e

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

sorted_map/README.mbt.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ Get all keys or values from the map.
155155
```moonbit
156156
test {
157157
let map = @sorted_map.from_array([(3, "three"), (1, "one"), (2, "two")])
158-
assert_eq!(map.keys(), [1, 2, 3])
159-
assert_eq!(map.values(), ["one", "two", "three"])
158+
assert_eq!(map.keys().collect(), [1, 2, 3])
159+
assert_eq!(map.values().collect(), ["one", "two", "three"])
160160
}
161161
```
162162

@@ -301,4 +301,4 @@ Key properties of the AVL tree implementation:
301301
Choose SortedMap when you need:
302302
- Key-value pairs sorted by key
303303
- Efficient range queries
304-
- Ordered traversal guarantees
304+
- Ordered traversal guarantees

sorted_map/map.mbt

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,18 +147,42 @@ pub fn eachi[K, V](self : T[K, V], f : (Int, K, V) -> Unit) -> Unit {
147147

148148
///|
149149
/// Returns all keys in the map.
150-
pub fn keys[K, V](self : T[K, V]) -> Array[K] {
151-
let keys = Array::new(capacity=self.size)
152-
self.each(fn(k, _v) { keys.push(k) })
153-
keys
150+
pub fn keys[K, V](self : T[K, V]) -> Iter[K] {
151+
Iter::new(fn(yield_) {
152+
fn go(node : Node[K, V]?) {
153+
loop node {
154+
None => IterContinue
155+
Some(node) =>
156+
if go(node.left) is IterContinue && yield_(node.key) is IterContinue {
157+
continue node.right
158+
} else {
159+
IterEnd
160+
}
161+
}
162+
}
163+
164+
go(self.root)
165+
})
154166
}
155167

156168
///|
157169
/// Returns all values in the map.
158-
pub fn values[K, V](self : T[K, V]) -> Array[V] {
159-
let values = Array::new(capacity=self.size)
160-
self.each(fn(_k, v) { values.push(v) })
161-
values
170+
pub fn values[K, V](self : T[K, V]) -> Iter[V] {
171+
Iter::new(fn(yield_) {
172+
fn go(node : Node[K, V]?) {
173+
loop node {
174+
None => IterContinue
175+
Some(node) =>
176+
if go(node.left) is IterContinue && yield_(node.value) is IterContinue {
177+
continue node.right
178+
} else {
179+
IterEnd
180+
}
181+
}
182+
}
183+
184+
go(self.root)
185+
})
162186
}
163187

164188
///|

sorted_map/sorted_map.mbti

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ fn iter[K, V](T[K, V]) -> Iter[(K, V)]
2727

2828
fn iter2[K, V](T[K, V]) -> Iter2[K, V]
2929

30-
fn keys[K, V](T[K, V]) -> Array[K]
30+
fn keys[K, V](T[K, V]) -> Iter[K]
3131

3232
fn new[K, V]() -> T[K, V]
3333

@@ -47,7 +47,7 @@ fn size[K, V](T[K, V]) -> Int
4747

4848
fn to_array[K, V](T[K, V]) -> Array[(K, V)]
4949

50-
fn values[K, V](T[K, V]) -> Array[V]
50+
fn values[K, V](T[K, V]) -> Iter[V]
5151

5252
// Types and methods
5353
type T[K, V]
@@ -61,15 +61,15 @@ impl T {
6161
is_empty[K, V](Self[K, V]) -> Bool
6262
iter[K, V](Self[K, V]) -> Iter[(K, V)]
6363
iter2[K, V](Self[K, V]) -> Iter2[K, V]
64-
keys[K, V](Self[K, V]) -> Array[K]
64+
keys[K, V](Self[K, V]) -> Iter[K]
6565
#deprecated
6666
op_get[K : Compare, V](Self[K, V], K) -> V?
6767
op_set[K : Compare, V](Self[K, V], K, V) -> Unit
6868
range[K : Compare, V](Self[K, V], K, K) -> Iter2[K, V]
6969
remove[K : Compare, V](Self[K, V], K) -> Unit
7070
size[K, V](Self[K, V]) -> Int
7171
to_array[K, V](Self[K, V]) -> Array[(K, V)]
72-
values[K, V](Self[K, V]) -> Array[V]
72+
values[K, V](Self[K, V]) -> Iter[V]
7373
}
7474
impl[K, V] Default for T[K, V]
7575
impl[K : Eq, V : Eq] Eq for T[K, V]

0 commit comments

Comments
 (0)