Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
"use strict";

/**
 * @file allows using classes as blank objects
 *
 * @example
 *   const ThisLessed = () => @thisless class ThisLessEd {
 *     get aboot() {
 *       return 100
 *     }
 *     moose() {
 *       // moose
 *     }
 *   }
 *
 * @example
 *   const Selflessed = self => class {
 *     get aboot() {
 *       return 100
 *     }
 *     moose() {
 *       // moose
 *     }
 *   }
 *
 * @example
 *   const getInitializedObj = () => self => ({
 *     get aboot() {
 *       return 100
 *     },
 *     moose() {
 *        // moose
 *     },
 *   })
 *
 * @example
 *   const getReturnedInitializedObj = () => self => {
 *     return {
 *       get aboot() {
 *         return 100
 *       },
 *       moose() {
 *          // moose
 *       },
 *     }
 *   }
 */
const _require = require("./toBlankObj"),
      toBlankObj = _require.toBlankObj,
      setDescriptorMiddleware = _require.setDescriptorMiddleware;

const _require2 = require("./isPlainObj"),
      isUndefined = _require2.isUndefined,
      isPlainObject = _require2.isPlainObject;
/**
 * @see toBlankObj
 * @param {Class} _class
 * @return {BlankObject}
 */


function thisless(_class) {
  if (!isPlainObject(_class)) {
    return toBlankObj(_class.prototype);
  }

  return _class;
}
/**
 * @param {Function} fn scoped reference that receives $this
 * @param {Object} self $this
 * @return {ClassPlainObj}
 *
 * @curried 2
 *
 * @example
 *
 *   self => class {
 *     eh = () => self
 *   }
 *
 *   //=> const blank = Object.create(null)
 *   //=> blank.eh = () => self
 *
 *   const isBlank = blank.prototype ===
 *        blank.constructor ===
 *        blank.__proto__ ===
 *        undefined
 *    //=> true
 *
 *    Object.keys(blank)
 *    //=> ['eh']
 *
 */


function selfless(fn, $self) {
  // $self = {}
  // inline curry
  if (arguments.length === 1) {
    // fn = self => class
    return function selflessCurry($$self) {
      // _class = fn($self)
      const _class = fn($$self);

      return thisless(_class);
    };
  } else {
    // _class = fn($self)
    const _class = fn($self);

    return thisless(_class);
  }
}
/**
 * @inheritdoc
 * @variation flipped arguments
 * @see selfless
 * @alias lessself
 */


function selfthis($self, fn) {
  if (arguments.length === 1) {
    return function selflessCurry(_class) {
      return selfless(_class, fn);
    };
  } else {
    const _class = fn($self);

    return thisless(_class);
  }
}

module.exports = {
  selfless,
  thisless,
  selfthis,
  toBlankObj,
  isUndefined,
  setDescriptorMiddleware
};
module.exports.default = module.exports;