typed-patterns
Version:
Basic design patterns
172 lines • 9.74 kB
JavaScript
;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const async = __importStar(require("async"));
const unexpected_1 = require("./unexpected");
/**
* Fails specified callback
* @param [callback] Callback function
* @param error Exception object
*/
function fail(callback, error) {
if (typeof callback === 'function') {
callback(error);
}
else if (typeof callback !== 'undefined') {
throw new TypeError('Function expected');
}
}
exports.fail = fail;
/**
* Successes specified callback
* @param [callback] Callback function
* @param result Array of result items
*/
function success(callback, ...result) {
if (typeof callback === 'function') {
callback(null, ...result);
}
else if (typeof callback !== 'undefined') {
throw new TypeError('Function expected');
}
}
exports.success = success;
/**
* Joins onSuccess and onFail callback into classical asynchronous callback function
* @param onSuccess Callback function that must be called on success result
* @param onFail Callback function that must be called on error
*/
function join(onSuccess, onFail) {
if (typeof onSuccess !== 'function') {
throw new TypeError('Function expected');
}
if (typeof onFail !== 'function') {
throw new TypeError('Function expected');
}
return function (error, ...result) {
if (error) {
onFail(error);
}
else {
onSuccess.apply(null, result);
}
};
}
exports.join = join;
/**
* Returns callback that wraps array of success results into single tuple
* @param callback Callback that accepts array of results as tuple
*/
function wrapCallback(callback) {
if (typeof callback !== 'function') {
throw new TypeError('Function expected');
}
return function (error, ...result) {
if (error) {
fail(callback, error);
}
else {
success(callback, result);
}
};
}
exports.wrapCallback = wrapCallback;
/**
* Returns callback that unwraps single tuple to an array of success results
* @param callback Callback that accepts array of success results
*/
function unwrapCallback(callback) {
if (typeof callback !== 'function') {
throw new TypeError('Function expected');
}
return function (error, ...result) {
if (error) {
fail(callback, error);
}
else {
success(callback, ...(result[0] || []));
}
};
}
exports.unwrapCallback = unwrapCallback;
/**
* Returns asynchronous worker function that wraps array of results into single tuple
* @param worker Asynchronous worker function that provides array of results to a callback
*/
function wrapWorker(worker) {
if (typeof worker !== 'function') {
throw new TypeError('Function expected');
}
return function (callback) {
worker(callback ? wrapCallback(callback) : undefined);
};
}
exports.wrapWorker = wrapWorker;
/**
* Returns asynchronous worker function that unwraps single result to an array of results
* @param worker Asynchronous worker function that provides single result as tuple
*/
function unwrapWorker(worker) {
if (typeof worker !== 'function') {
throw new TypeError('Function expected');
}
return function (callback) {
worker(callback ? unwrapCallback(callback) : undefined);
};
}
exports.unwrapWorker = unwrapWorker;
function collect(collection) {
return function (callback) {
if (Array.isArray(collection)) {
async.parallel(collection, (error, results) => {
if (error) {
fail(callback, error);
}
else {
success(callback, results);
}
});
}
else {
async.parallel(collection, (error, results) => {
if (error) {
fail(callback, error);
}
else {
success(callback, results);
}
});
}
};
}
exports.collect = collect;
/**
* Returns asynchronous processor functions that uses type-guard for accepting specific context
* and delegates work to specified processor
* @param guard Type-guard function for specific context acceptance
* @param processor Asynchronous processor function for specific context
*/
function guardAsyncProcessor(guard, processor) {
if (typeof guard !== 'function') {
throw new TypeError('Function expected as guard');
}
if (typeof processor !== 'function') {
throw new TypeError('Function expected as guard');
}
return (context, callback, next) => {
if (!guard(context)) {
unexpected_1.unexpected(undefined, callback, next);
}
else {
processor(context, callback, next);
}
};
}
exports.guardAsyncProcessor = guardAsyncProcessor;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS91dGlsL2FzeW5jLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsNkNBQStCO0FBSS9CLDZDQUEwQztBQTRCMUM7Ozs7R0FJRztBQUNILFNBQWdCLElBQUksQ0FDbEIsUUFBaUQsRUFDakQsS0FBZ0I7SUFFaEIsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7UUFDakMsUUFBdUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNqRDtTQUFNLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO1FBQzFDLE1BQU0sSUFBSSxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQUMxQztBQUNILENBQUM7QUFURCxvQkFTQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixPQUFPLENBQ3JCLFFBQWlELEVBQ2pELEdBQUcsTUFBYztJQUVqQixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtRQUNsQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7S0FDM0I7U0FBTSxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRTtRQUMxQyxNQUFNLElBQUksU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FDMUM7QUFDSCxDQUFDO0FBVEQsMEJBU0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsSUFBSSxDQUNsQixTQUFzQyxFQUN0QyxNQUF3QztJQUV4QyxJQUFJLE9BQU8sU0FBUyxLQUFLLFVBQVUsRUFBRTtRQUNuQyxNQUFNLElBQUksU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FDMUM7SUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRTtRQUNoQyxNQUFNLElBQUksU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLFVBQVMsS0FBd0IsRUFBRSxHQUFHLE1B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