'use strict'; var isCallable = require('../object/is-callable') , value = require('../object/valid-value') , call = Function.prototype.call; module.exports = function (fmap) { fmap = Object(value(fmap)); return function (pattern) { var context = value(this); pattern = String(pattern); return pattern.replace(/%([a-zA-Z]+)|\\([\u0000-\uffff])/g, function (match, token, escape) { var t, r; if (escape) return escape; t = token; while (t && !(r = fmap[t])) t = t.slice(0, -1); if (!r) return match; if (isCallable(r)) r = call.call(r, context); return r + token.slice(t.length); }); }; };