# ETOOBUSY ðŸš€ minimal blogging for the impatient

# Dijkstra Algorithm - as functions only

**TL;DR**

I made a version of Dijkstra.pm that returns two sub references instead of an object: DijkstraFunction.pm.

Some time ago (in 2017, according to git blame) I translated the code for the Dijkstra Algorithm from its Java implementation into Perl, resulting in Dijkstra.pm inside cglib.

If you (yes, Iâ€™m looking at you, future me!) need a refresher for what
this algorithm is good forâ€¦ suffices to say that is solves the *single
source shortest paths* problem. In brief, you have one starting node
(that is the *single source*) and it computes the minimul distance, as
well as the path with that distance, towards every other (reachable)
node in the graph.

As Iâ€™ve probably already written elsewhere, cglib is explicitly
coded as a *copy-and-paste* library of functions. For this reason, I was
not entirely happy with the implementation because it returned an object
(blessed into the `Dijkstra`

package).

Inspired by other functions in that library, I decided to code an alternative DijkstraFunction.pm library file that does pretty much the same (with the same code! Duplication!!!) but returns a hash reference instead.

```
return {
path_to => sub {
my ($v) = @_;
my $vid = $id_of->($v);
my $thr = $thread_to{$vid} || return; # connected?
my @retval;
while ($v) {
unshift @retval, $v;
($v, $vid) = @{$thr}{qw< p pid >};
$thr = $thread_to{$vid};
}
return wantarray ? @retval : \@retval;
},
distance_to => sub { ($thread_to{$id_of->($_[0])} || {})->{d} },
};
```

This hash contains two keys: `path_to`

and `distance_to`

. The
corresponding value is a subroutine reference that allows calculating
the path, or the distance, towards a provided target vertex.

Soâ€¦ enjoy DijkstraFunction.pm!

*Comments? Octodon, Twitter, GitHub, Reddit, or drop me a line!*