'use strict';

/* !

* Chai - getFuncName utility
* Copyright(c) 2012-2016 Jake Luer <jake@alogicalparadox.com>
* MIT Licensed
*/

/**

* ### .getFuncName(constructorFn)
*
* Returns the name of a function.
* When a non-function instance is passed, returns `null`.
* This also includes a polyfill function if `aFunc.name` is not defined.
*
* @name getFuncName
* @param {Function} funct
* @namespace Utils
* @api public
*/

var toString = Function.prototype.toString; var functionNameMatch = /s*function(?:s|s*/*+*/s*)*(+)/; function getFuncName(aFunc) {

if (typeof aFunc !== 'function') {
  return null;
}

var name = '';
if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') {
  // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined
  var match = toString.call(aFunc).match(functionNameMatch);
  if (match) {
    name = match[1];
  }
} else {
  // If we've got a `name` property we just use it
  name = aFunc.name;
}

return name;

}

module.exports = getFuncName;