Ramda Adjunct 4.0.0

delayP.js

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;