I was trying to add an items() iterator. As Nim interators do not support direct iteration, it can be done with a stack or references to the parent and the current child. As the parent reference was already there I added a cur index and got this, which seems to be OK: H[M, D: Dim; RT, LT] = ref object of RTRef[RT] parent: H[M, D, RT, LT] numEntries: int cur: int # for iteration level: int iterator items*[M, D: Dim; RT, LT](t: RTree[M, D, RT, LT]): L[D, RT, LT] = var el: H[M, D, RT, LT] = t.root assert el.parent == nil el.cur = 0 while el != nil: if el of Leaf[M, D, RT, LT]: for i, o in Leaf[M, D, RT, LT](el).a: if i == Leaf[M, D, RT, LT](el).numEntries: break yield o el = el.parent elif el of Node[M, D, RT, LT]: if el.cur < el.numEntries: let h = el el = Node[M, D, RT, LT](el).a[el.cur].n assert el.parent == h el.cur = 0 h.cur += 1 else: el = el.parent else: assert false Run
But the initial module gives a lot of warnings, see <https://github.com/StefanSalewski/RTree/issues/1> The "Hint: condition is always true:" should be no problem. For /tmp/hhh/rtree.nim(283, 24) Warning: Deprecated since v1.4; there should not be `high(value)`. Use `high(type)`.; high is deprecated [Deprecated] Should I really replace > var m0 = lx.b[0].a.high with > var m0 = lx.b[0].a.typeof.high ? And the final problem which I could not fix 3 years ago is: /tmp/hhh/rtree.nim(83, 7) Warning: Special variable 'result' is shadowed. [ResultShadowed]| ---|--- proc center(r: Box): auto = #BoxCenter[r.len, type(r[0].a)] = var result: BoxCenter[r.len, type(r[0].a)] I am still not able to avoid the auto keyword. This does not compile: proc center(r: Box): BoxCenter[r.len, type(r[0].a)] Is there a trick available to avoid auto? Because I can remember a discussion maybe two years ago that Mr. Rumpf considers to remove the auto keyword? Final question: In the code I am using many constructs like type(r[0].a) which seems to be accepted by the compiler. Should we better use typeof() like typeof(r[0].a) now?