UNPKG

foop

Version:

interfaces that describe their intentions.

66 lines (48 loc) 1.59 kB
// 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 }