index.js
function Wayfarer (dft) {
  if (!(this instanceof Wayfarer)) return new Wayfarer(dft)

  var _default = (dft || '').replace(/^\//, '')
  var _trie = trie()

  emit._trie = _trie
  emit.on = on
  emit.emit = emit
  emit.match = match
  emit._wayfarer = true

  return emit

  // define a route
  // (str, fn) -> obj
  function on (route, fn) {
    assert.equal(typeof route, 'string')
    assert.equal(typeof fn, 'function')

    var cb = fn._wayfarer && fn._trie ? fn : proxy
    route = route || '/'
    cb.route = route

    if (cb._wayfarer && cb._trie) {
      _trie.mount(route, cb._trie.trie)
    } else {
      var node = _trie.create(route)
      node.cb = cb
    }

    return emit

    function proxy () {
      return fn.apply(this, Array.prototype.slice.call(arguments))
    }
  }

  // match and call a route
  // (str, obj?) -> null
  function emit (route) {
    var matched = match(route)

    var args = new Array(arguments.length)
    args[0] = matched.params
    for (var i = 1; i < args.length; i++) {
      args[i] = arguments[i]
    }

    return matched.cb.apply(matched.cb, args)
  }

  function match (route) {
    assert.notEqual(route, undefined, "'route' must be defined")

    var matched = _trie.match(route)
    if (matched && matched.cb) return new Route(matched)

    var dft = _trie.match(_default)
    if (dft && dft.cb) return new Route(dft)

    throw new Error("route '" + route + "' did not match")
  }

  function Route (matched) {
    this.cb = matched.cb
    this.route = matched.cb.route
    this.params = matched.params
  }
}
function Wayfarer (dft) {
  if (!(this instanceof Wayfarer)) return new Wayfarer(dft)

  var _default = (dft || '').replace(/^\//, '')
  var _trie = trie()

  emit._trie = _trie
  emit.on = on
  emit.emit = emit
  emit.match = match
  emit._wayfarer = true

  return emit

  // define a route
  // (str, fn) -> obj
  function on (route, fn) {
    assert.equal(typeof route, 'string')
    assert.equal(typeof fn, 'function')

    var cb = fn._wayfarer && fn._trie ? fn : proxy
    route = route || '/'
    cb.route = route

    if (cb._wayfarer && cb._trie) {
      _trie.mount(route, cb._trie.trie)
    } else {
      var node = _trie.create(route)
      node.cb = cb
    }

    return emit

    function proxy () {
      return fn.apply(this, Array.prototype.slice.call(arguments))
    }
  }

  // match and call a route
  // (str, obj?) -> null
  function emit (route) {
    var matched = match(route)

    var args = new Array(arguments.length)
    args[0] = matched.params
    for (var i = 1; i < args.length; i++) {
      args[i] = arguments[i]
    }

    return matched.cb.apply(matched.cb, args)
  }

  function match (route) {
    assert.notEqual(route, undefined, "'route' must be defined")

    var matched = _trie.match(route)
    if (matched && matched.cb) return new Route(matched)

    var dft = _trie.match(_default)
    if (dft && dft.cb) return new Route(dft)

    throw new Error("route '" + route + "' did not match")
  }

  function Route (matched) {
    this.cb = matched.cb
    this.route = matched.cb.route
    this.params = matched.params
  }
}
function Wayfarer ( dft ) { if ( ! ( this instanceof Wayfarer ) ) return new Wayfarer ( dft ) var _default = ( dft || '' ) . replace ( / ^\/ / , '' ) var _trie = trie ( ) emit . _trie = _trie emit . on = on emit . emit = emit emit . match = match emit . _wayfarer = true return emit // define a route // (str, fn) -> obj function on ( route , fn ) { assert . equal ( typeof route , 'string' ) assert . equal ( typeof fn , 'function' ) var cb = fn . _wayfarer && fn . _trie ? fn : proxy route = route || '/' cb . route = route if ( cb . _wayfarer && cb . _trie ) { _trie . mount ( route , cb . _trie . trie ) } else { var node = _trie . create ( route ) node . cb = cb } return emit function proxy ( ) { return fn . apply ( this , Array . prototype . slice . call ( arguments ) ) } } // match and call a route // (str, obj?) -> null function emit ( route ) { var matched = match ( route ) var args = new Array ( arguments . length ) args [ 0 ] = matched . params for ( var i = 1 ; i < args . length ; i ++ ) { args [ i ] = arguments [ i ] } return matched . cb . apply ( matched . cb , args ) } function match ( route ) { assert . notEqual ( route , undefined , "'route' must be defined" ) var matched = _trie . match ( route ) if ( matched && matched . cb ) return new Route ( matched ) var dft = _trie . match ( _default ) if ( dft && dft . cb ) return new Route ( dft ) throw new Error ( "route '" + route + "' did not match" ) } function Route ( matched ) { this . cb = matched . cb this . route = matched . cb . route this . params = matched . params } }
create a router str -> obj
create a router str - > obj