foop
Version:
interfaces that describe their intentions.
66 lines (48 loc) • 1.59 kB
JavaScript
// eslint-disable-next-line
// @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
}