Home Reference Source

ts_temp/function/tryCatch.js

import curryN from './curryN';
/**
 * Takes two functions, tryer and catcher.
 *
 * Returns a function that, when invoked with zero or more parameters,
 * calls the tryer with those parameters, and if tryer throws,
 * calls the catcher with the error as first argument and original arguments as rest.
 * If that still throws, then ¯\_(ツ)_/¯
 *
 * @param {Function} tryer
 * @param {Function} catcher
 * @return {Function}
 * @example
 *      tryCatch(x => x.length, () => 0)([ 1, 2, 3 ]) // 3
 *      tryCatch(x => x.length, () => 0)( undefined ) // 0
 *      tryCatch(
 *          someDataTransform,
 *          (err, ...rest) => {
 *              logAsyncToServer('someDataTransform failed', err, 'with arguments', rest);
 *              return DEFAULT_VALUE;
 *          }
 *      )( someIncompleteData ) // DEFAULT_VALUE (error is logged somewhere)
 */
export default curryN(2, (tryer, catcher) => {
    return (...args) => {
        try {
            return tryer.apply(this, args);
        }
        catch (e) {
            args.unshift(e);
            return catcher.apply(this, args);
        }
    };
});