Hi and merry Christmas,

I was trying to port [petagraph](https://github.com/petgraph/petgraph) rust 
library to nim and although I made some 
[progress](https://gist.github.com/b3liever/de2d4e2267b13832f7d52f10ba3140fe) I 
am struggling with some fundamental decisions.

for example, when adding a node in the graph, it returns the index:
    
    
    var graph: Graph[string, float]
    let nodeA = graph.addNode("a")
    let nodeB = graph.addNode("b")
    let nodeC = graph.addNode("c")
    let nodeD = graph.addNode("d")
    let nodeE = graph.addNode("e")
    let nodeF = graph.addNode("f")
    let nodeG = graph.addNode("g")
    let nodeH = graph.addNode("h")
    
    # Also returns the edge index when adding an edge, not sure if its useful
    let edge1 = graph.addEdge(nodeA, nodeB, 1.0)
    
    Run

These indices are `distinct` types like so:
    
    
    type
      IndexType = int
      NodeIndex = distinct IndexType
      EdgeIndex = distinct IndexType
    
    Run

That allows to have array element access syntax for nodes and edges:
    
    
    proc `[]`*[N, E](self: Graph[N, E], a: NodeIndex): N =
      ## Access the weight for node `a`.
      self.nodes[int(a)].weight
    
    proc `[]`*[N, E](self: Graph[N, E], e: EdgeIndex): E =
      ## Access the weight for edge `e`.
      self.edges[int(e)].weight
    
    # works like so:
    echo graph[edge1] # 1.0
    echo graph[nodeA] # "a"
    
    Run

And this was the only benefit I think there is with `distinct` indices, 
consider this code:
    
    
    import graph, sequtils
    let graph2 = fromEdges[int, int](mapLiterals(@[
       (0, 1), (0, 2), (0, 3),
       (1, 2), (1, 3),
       (2, 3)], NodeIndex))
    
    Run

becomes tiresome to write, since everything needs to converted to the correct 
`IndexType` subtype. Also the internal code is littered with 
`self.nodes[int(nix)]`. My question is does it worth it, or should I just use 
int everywhere? 

Reply via email to