private IEnumerable <Route> Compute(Request request)
        {
            var town = _towns.FirstOrDefault(a => a.Name == request.From);

            _queue.Enqueue(town, 0, Route.Empty);

            while (_queue.HasData)
            {
                _queue.Dequeue();

                foreach (var neighbor in _queue.CurrentTown.Neighbors)
                {
                    town = neighbor.Key;
                    int distance = neighbor.Value;

                    if ((_queue.CurrentRoute.Distance + distance) >= (request.DistanceLessThan ?? int.MaxValue))
                    {
                        continue;
                    }

                    if (_queue.CurrentRoute.Stops > (request.MaxStop ?? int.MaxValue))
                    {
                        continue;
                    }

                    if (town.Name == request.To)
                    {
                        if (request.AllowCircularRoute)
                        {
                            _queue.Enqueue(town, distance, _queue.CurrentRoute);
                        }

                        yield return(_queue.CurrentRoute.NewRouteTo(request.To, distance));
                    }
                    else
                    {
                        if (_queue.CurrentRoute.TownHasVisited(town) && !request.AllowCircularRoute)
                        {
                            continue;
                        }

                        _queue.Enqueue(town, distance, _queue.CurrentRoute);
                    }
                }
            }
        }