function _prepareRemoveCallback(removeFunction, fileOrDirName, sync, cleanupCallbackSync) {
  let called = false;

  // if sync is true, the next parameter will be ignored
  return function _cleanupCallback(next) {

    /* istanbul ignore else */
    if (!called) {
      // remove cleanupCallback from cache
      const toRemove = cleanupCallbackSync || _cleanupCallback;
      const index = _removeObjects.indexOf(toRemove);
      /* istanbul ignore else */
      if (index >= 0) _removeObjects.splice(index, 1);

      called = true;
      if (sync || removeFunction === FN_RMDIR_SYNC || removeFunction === FN_RIMRAF_SYNC) {
        return removeFunction(fileOrDirName);
      } else {
        return removeFunction(fileOrDirName, next || function() {});
      }
    }
  };
}
Creates a guarded function wrapping the removeFunction call.

The cleanup callback is save to be called multiple times.
Subsequent invocations will be ignored.

@param {Function} removeFunction
@param {string} fileOrDirName
@param {boolean} sync
@param {cleanupCallbackSync?} cleanupCallbackSync
@returns {cleanupCallback | cleanupCallbackSync}
@private