I am trying to understand the problem depicted in this [Stack Overflow post —
implementing map min that takes the tables keys iterator as argument in
nim](https://stackoverflow.com/questions/70240040/implementing-map-min-that-takes-the-tables-keys-iterator-as-argument-in-nim).
The author of the post tries three attempts to define a map function that would
work for tables. I guess there is a type error with its first attempt:
iterator map[A, B](iter: iterable[A], fn: A -> B): B =
for x in iter:
yield fn(x)
Run
When I try its code, I have this:
import std/[sugar, tables]
# A mapping from coordinates (x, y) to values.
var locations = initTable[(int, int), int]()
locations[(1, 2)] = 1
locations[(2, 1)] = 2
locations[(-2, 5)] = 3
echo typeof(locations.keys)
echo locations.keys is (int, int)
echo locations.keys is iterable[(int, int)]
Run
I get:
(int, int)
true
false
Run
while I would expect:
iterable[(int, int)]
false
true
Run
I don't understand why I don't have an iterable type there. Is this due to the
`lent` return type ? See the prototype to the keys iterator:
iterator keys[A, B](t: Table[A, B]): lent A
Run
(I did not find any mention about the `lent` return type in the
[manual](https://nim-lang.org/docs/manual.html), but got a description in
[destructors
documentation](https://nim-lang.org/docs/destructors.html#lent-type) which is
not an obvious place to look for an unknown system type.)
Can we avoid this with another prototype in the standard library ? Like:
iterator keys[A, B](t: Table[A, B]): lent iterable[lent A]
Run