I have this following proc maxIndex that returns the index that holds the largest item in my heap structure:
proc maxIndex[Comparable](heap: Heap[Comparable]; currenti, lefti, righti: int): int {.inline.} =
# C > L and C > R ? C
# L > C and L > R ? L
# R > C and R > L ? R
if heap.data[currenti] >= heap.data[lefti] and heap.data[currenti] >= heap.data[lefti]:
return currenti
if heap.data[lefti] >= heap.data[currenti] and heap.data[lefti] >= heap.data[righti]:
return lefti
if heap.data[righti] >= heap.data[currenti] and heap.data[righti] >= heap.data[lefti]:
return righti
quit("Logical error reached.") # TODO: cleanup
Now I have to implement a minIndex proc. There is obviously a lot of code duplication because the only difference between these to procs is the comparison operation.
I would like to know if it's possible to pass a > or < operator to a template so I don't have to re-implement the whole body.
Like this:
proc fn1(a, b: int; fn: proc(x, y: int): bool) =
echo(fn(a, b))
fn1(2, 10, `>`) # should print false
fn1(20, 10, `>`) # should print true
Should be just fine.
Also, you code can potentially benefit from a shortcut inside a proc:
template d: auto = heap.data