import { curry, propOr, partial, nth } from 'ramda'; import isNonNegative from './isNonNegative'; import isInteger from './isInteger'; /** * Creates a promise which resolves/rejects after the specified milliseconds. * * @func delayP * @memberOf RA * @category Function * @sig Number -> Promise Undefined * @sig {timeout: Number, value: a} -> Promise a * @param {number|Object} milliseconds number of milliseconds or options object * @return {Promise} A Promise that is resolved/rejected with the given value (if provided) after the specified delay * @example * * RA.delayP(200); //=> Promise(undefined) * RA.delayP({ timeout: 1000, value: 'hello world' }); //=> Promise('hello world') * RA.delayP.reject(100); //=> Promise(undefined) * RA.delayP.reject({ timeout: 100, value: new Error('error') }); //=> Promise(Error('error')) */ const makeDelay = curry((settleFnPicker, opts) => { let timeout; let value; if (isInteger(opts) && isNonNegative(opts)) { timeout = opts; } else { timeout = propOr(0, 'timeout', opts); value = propOr(value, 'value', opts); } return new Promise((...args) => { const settleFn = settleFnPicker(args); setTimeout(partial(settleFn, [value]), timeout); }); }); const delayP = makeDelay(nth(0)); delayP.reject = makeDelay(nth(1)); export default delayP;