Vigdís — LFE Friday, LiffyBot studying Erlang modules in a Mead-style command room

LFE Friday - digraph:add_vertex/1

Heads up: This post was written for LFE 0.10 / Erlang/OTP 18. The current release is LFE 2.2.0. APIs and examples may be outdated.

This week's LFE Friday was translated with permission from the Erlang Thursday series by Steven Proctor. This week's translator: Robert Virding.

Today's LFE Friday starts to dig into the digraph module, as promised last week, and takes a look at digraph:add_vertex/1.

First we create a new directed graph, so we have something we can add vertices to.

> (set graph (digraph:new))
#(digraph 20495 24592 28689 true)

We then add some vertices to the graph by using digraph:add_vertex/1.

> (digraph:add_vertex graph)
($v . 0)
> (digraph:add_vertex graph)
($v . 1)
> (digraph:add_vertex graph)
($v . 2)

As we don't specify any information about the vertex we want to add, LFE will create a new vertex for us of the format ($v . i), with an empty list as the label where i is a non-negative integer.

We can also use digraph:add_vertex/2 to add a vertex if we wish to provide the vertex identifier, or provide vertex identifier and label in the case of digraph:add_vertex/3. As with digraph:add_vertex/1, digraph:add_vertex/2 uses the empty list as the label as well.

> (digraph:add_vertex graph 'vertex1)
vertex1
> (digraph:add_vertex graph 'vertex2 "Vertex 2")
vertex2

We have now added 5 vertices, and can check what vertices we have in the digraph() by using digraph:vertices/1.

> (digraph:vertices graph)
(($v . 2) ($v . 1) ($v . 0) vertex2 vertex1)

If we decide we want to try to add a vertex ourselves of the format ($v . i), we can run into trouble if you call digraph:add_vertex/1 after it.

> (digraph:add_vertex graph '($v . 3))
($v . 3)
> (digraph:add_vertex graph)          
($v . 3)
> (digraph:vertices graph)            
(($v . 2) ($v . 1) ($v . 0) ($v . 3) vertex2 vertex1)
> (digraph:add_vertex graph '($v . 4))
($v . 4)
> (digraph:vertices graph)            
(($v . 2) ($v . 1) ($v . 4) ($v . 0) ($v . 3) vertex2 vertex1)

So we add a vertex by specifying the vertex() we want to add, and then add a new vertex and let LFE take care of creating that vertex, and we wind up "losing" a vertex, as one essentially gets overridden when we look at the end state of the digraph().

- Proctor, Robert