The internal lodash function createWrapper exported as a module for creating wrapped versions of functions with binding, currying, partial application, and argument reordering support.
npx @tessl/cli install tessl/npm-lodash--createwrapper@4.0.0The internal lodash function createWrapper exported as a standalone module. This sophisticated utility creates wrapped versions of functions with support for various functional programming patterns including binding, currying, partial application, argument reordering, and arity control.
npm install lodash._createwrappervar createWrapper = require('lodash._createwrapper');var createWrapper = require('lodash._createwrapper');
// Create a simple bound function
function greet(greeting, name) {
return greeting + ' ' + name + '!';
}
// Bind with BIND_FLAG (1)
var boundGreet = createWrapper(greet, 1, null, ['Hello'], null, null, null, null);
console.log(boundGreet('World')); // "Hello World!"
// Create a curried function with CURRY_FLAG (8)
function add(a, b, c) {
return a + b + c;
}
var curriedAdd = createWrapper(add, 8, null, null, null, null, null, 3);
console.log(curriedAdd(1)(2)(3)); // 6
console.log(curriedAdd(1, 2)(3)); // 6The createWrapper function implements a sophisticated wrapper creation system using:
Creates sophisticated function wrappers with configurable behavior through bitmask flags.
/**
* Creates a function that either curries or invokes `func` with optional
* `this` binding and partially applied arguments.
*
* @param {Function|string} func The function or method name to wrap
* @param {number} bitmask The bitmask of wrapper flags
* @param {*} [thisArg] The `this` binding of `func`
* @param {Array} [partials] The arguments to be partially applied
* @param {Array} [holders] The `partials` placeholder indexes
* @param {Array} [argPos] The argument positions of the new function
* @param {number} [ary] The arity cap of `func`
* @param {number} [arity] The arity of `func`
* @returns {Function} Returns the new wrapped function
* @throws {TypeError} Throws if `func` is not a function and not using BIND_KEY_FLAG
*/
function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity);Bitmask Flags:
// Wrapper behavior flags (used in bitmask parameter)
const BIND_FLAG = 1; // _.bind
const BIND_KEY_FLAG = 2; // _.bindKey
const CURRY_BOUND_FLAG = 4; // _.curry or _.curryRight of a bound function
const CURRY_FLAG = 8; // _.curry
const CURRY_RIGHT_FLAG = 16; // _.curryRight
const PARTIAL_FLAG = 32; // _.partial
const PARTIAL_RIGHT_FLAG = 64; // _.partialRight
const ARY_FLAG = 128; // _.ary (arity control)
const FLIP_FLAG = 512; // _.flip (argument order reversal)Usage Examples:
var createWrapper = require('lodash._createwrapper');
// Example 1: Simple binding
function greet(greeting, name) {
return this.prefix + greeting + ' ' + name + '!';
}
var context = { prefix: 'Say: ' };
var boundGreet = createWrapper(greet, 1, context, ['Hello'], null, null, null, null);
console.log(boundGreet('World')); // "Say: Hello World!"
// Example 2: Currying
function multiply(a, b, c) {
return a * b * c;
}
var curriedMultiply = createWrapper(multiply, 8, null, null, null, null, null, 3);
var multiplyBy2 = curriedMultiply(2);
var multiplyBy2And3 = multiplyBy2(3);
console.log(multiplyBy2And3(4)); // 24
// Example 3: Partial application
function calculate(operation, a, b, c) {
if (operation === 'sum') return a + b + c;
if (operation === 'product') return a * b * c;
}
var sum = createWrapper(calculate, 32, null, ['sum'], null, null, null, null);
console.log(sum(1, 2, 3)); // 6
// Example 4: Argument reordering with flip
function divide(a, b) {
return a / b;
}
var flippedDivide = createWrapper(divide, 512, null, null, null, null, null, null);
console.log(flippedDivide(2, 10)); // 5 (equivalent to divide(10, 2))
// Example 5: Arity control
function variadic() {
return Array.prototype.slice.call(arguments);
}
var binary = createWrapper(variadic, 128, null, null, null, null, 2, null);
console.log(binary(1, 2, 3, 4, 5)); // [1, 2] (only first 2 arguments)You can combine multiple flags to create sophisticated wrapper behaviors:
var createWrapper = require('lodash._createwrapper');
// Combine BIND_FLAG + PARTIAL_FLAG for bound partial application
function logger(level, category, message) {
console.log('[' + level + '] ' + category + ': ' + message);
}
var context = { prefix: 'App ' };
var infoLogger = createWrapper(
logger,
1 | 32, // BIND_FLAG | PARTIAL_FLAG
context,
['INFO'],
null,
null,
null,
null
);
infoLogger('Database', 'Connection established'); // [INFO] Database: Connection established
// Combine CURRY_FLAG + PARTIAL_FLAG for curried partial application
function process(config, data, options, callback) {
// Processing logic
callback(null, 'processed: ' + data);
}
var curriedProcessor = createWrapper(
process,
8 | 32, // CURRY_FLAG | PARTIAL_FLAG
null,
[{ mode: 'fast' }], // partial config
null,
null,
null,
4 // arity
);
// Can be called with currying
curriedProcessor('mydata')({ compress: true })(function(err, result) {
console.log(result); // 'processed: mydata'
});For curried functions, the wrapper supports placeholder values for flexible argument positioning:
var createWrapper = require('lodash._createwrapper');
function format(template, value1, value2, value3) {
return template
.replace('%1', value1)
.replace('%2', value2)
.replace('%3', value3);
}
var curriedFormat = createWrapper(format, 8, null, null, null, null, null, 4);
// Use placeholder pattern (when accessing .placeholder property in real lodash)
// Note: In this standalone module, placeholder handling is internal
var template = curriedFormat('Hello %1, you have %2 %3');
console.log(template('John', 5, 'messages')); // "Hello John, you have 5 messages"The createWrapper function includes comprehensive error handling:
var createWrapper = require('lodash._createwrapper');
try {
// This will throw TypeError since 'not-a-function' is not a function
// and BIND_KEY_FLAG is not used
var wrapper = createWrapper('not-a-function', 1, null, null, null, null, null, null);
} catch (error) {
console.log(error.message); // "Expected a function"
}
// Valid usage with BIND_KEY_FLAG for method names
var obj = {
getValue: function() { return this.value; },
value: 42
};
var boundMethod = createWrapper('getValue', 2, obj, null, null, null, null, null);
console.log(boundMethod()); // 42this context