text: var _ = require('../lodash')
  
  module.exports = floydWarshall
  
  var DEFAULT_WEIGHT_FUNC = _.constant(1)
  
  function floydWarshall (g, weightFn, edgeFn) {
    return runFloydWarshall(g,
      weightFn || DEFAULT_WEIGHT_FUNC,
      edgeFn || function (v) { return g.outEdges(v) })
  }
  
  function runFloydWarshall (g, weightFn, edgeFn) {
    const results = {}
    const nodes = g.nodes()
  
    nodes.forEach(function (v) {
      results[v] = {}
      results[v][v] = { distance: 0 }
      nodes.forEach(function (w) {
        if (v !== w) {
          results[v][w] = { distance: Number.POSITIVE_INFINITY }
        }
      })
      edgeFn(v).forEach(function (edge) {
        const w = edge.v === v ? edge.w : edge.v
        const d = weightFn(edge)
        results[v][w] = { distance: d, predecessor: v }
      })
    })
  
    nodes.forEach(function (k) {
      var rowK = results[k]
      nodes.forEach(function (i) {
        var rowI = results[i]
        nodes.forEach(function (j) {
          var ik = rowI[k]
          var kj = rowK[j]
          var ij = rowI[j]
          var altDistance = ik.distance + kj.distance
          if (altDistance < ij.distance) {
            ij.distance = altDistance
            ij.predecessor = kj.predecessor
          }
        })
      })
    })
  
    return results
  }
  