text: define(function () {
    /**
     * @class core.func
     *
     * func utils (for high-order func's arg)
     *
     * @singleton
     * @alternateClassName func
     */
    var func = (function () {
      var eq = function (itemA) {
        return function (itemB) {
          return itemA === itemB;
        };
      };
  
      var eq2 = function (itemA, itemB) {
        return itemA === itemB;
      };
  
      var peq2 = function (propName) {
        return function (itemA, itemB) {
          return itemA[propName] === itemB[propName];
        };
      };
  
      var ok = function () {
        return true;
      };
  
      var fail = function () {
        return false;
      };
  
      var not = function (f) {
        return function () {
          return !f.apply(f, arguments);
        };
      };
  
      var and = function (fA, fB) {
        return function (item) {
          return fA(item) && fB(item);
        };
      };
  
      var self = function (a) {
        return a;
      };
  
      var idCounter = 0;
  
      /**
       * generate a globally-unique id
       *
       * @param {String} [prefix]
       */
      var uniqueId = function (prefix) {
        var id = ++idCounter + '';
        return prefix ? prefix + id : id;
      };
  
      /**
       * returns bnd (bounds) from rect
       *
       * - IE Compatability Issue: http://goo.gl/sRLOAo
       * - Scroll Issue: http://goo.gl/sNjUc
       *
       * @param {Rect} rect
       * @return {Object} bounds
       * @return {Number} bounds.top
       * @return {Number} bounds.left
       * @return {Number} bounds.width
       * @return {Number} bounds.height
       */
      var rect2bnd = function (rect) {
        var $document = $(document);
        return {
          top: rect.top + $document.scrollTop(),
          left: rect.left + $document.scrollLeft(),
          width: rect.right - rect.left,
          height: rect.bottom - rect.top
        };
      };
  
      /**
       * returns a copy of the object where the keys have become the values and the values the keys.
       * @param {Object} obj
       * @return {Object}
       */
      var invertObject = function (obj) {
        var inverted = {};
        for (var key in obj) {
          if (obj.hasOwnProperty(key)) {
            inverted[obj[key]] = key;
          }
        }
        return inverted;
      };
  
      /**
       * @param {String} namespace
       * @param {String} [prefix]
       * @return {String}
       */
      var namespaceToCamel = function (namespace, prefix) {
        prefix = prefix || '';
        return prefix + namespace.split('.').map(function (name) {
          return name.substring(0, 1).toUpperCase() + name.substring(1);
        }).join('');
      };
  
      return {
        eq: eq,
        eq2: eq2,
        peq2: peq2,
        ok: ok,
        fail: fail,
        self: self,
        not: not,
        and: and,
        uniqueId: uniqueId,
        rect2bnd: rect2bnd,
        invertObject: invertObject,
        namespaceToCamel: namespaceToCamel
      };
    })();
  
    return func;
  });
  