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    
@skava/modules / ___dist / chain-able / src / compose / composer.js
Size: Mime:
// eslint-disable-next-line
'use strict'; // @see compose note on looping, this solves that

const isUndefined = require("../deps/is/undefined");

const isFunction = require("../deps/is/function");

const setToArray = require("../deps/cast/setToArray");

const reduceArray = require("../deps/loop/reduce/reduceArray");

const ENV_DEBUG = false; // .codePointAt(0).toString()
// '🎼'

const COMPOSER_KEY = '127932'; // '🎩'

const TOP_BASE_CLASS_KEY = '127913';

const callCurrent = (accumulated, current) => {
  return current(accumulated);
}; // @NOTE 'top' is a global property o.o


module.exports = function addCompose(fn, defaultTop) {
  if (ENV_DEBUG) {
    console.log('composer_args', {
      fn,
      defaultTop
    });
  }

  let composed = fn(defaultTop);

  if (ENV_DEBUG) {
    console.log('composer_add_compose_composed', {
      composed
    });
  }

  if (isUndefined(composed.composer)) {
    // only one compose fn
    composed.composer = function (SuperClass, options) {
      if (ENV_DEBUG) {
        console.log('composer_composer', {
          composed,
          SuperClass
        });
      } // @NOTE scoping issues if this is only set once
      // if (!composed[TOP_BASE_CLASS_KEY]) {


      composed[TOP_BASE_CLASS_KEY] = SuperClass;
      let arr = setToArray(composed[COMPOSER_KEY]);
      const composition = reduceArray(arr, callCurrent, composed[TOP_BASE_CLASS_KEY]);

      if (ENV_DEBUG) {
        console.log('composer_composed', {
          arr,
          composition
        });
      }

      return composition;
    };

    composed[COMPOSER_KEY] = new Set();
  }

  if (isFunction(fn)) {
    composed[COMPOSER_KEY].add(fn);
  }

  return composed;
};