function resolveParentPathBy( path, options, predicate ) {
	var spath;
	var child;
	var test;
	var opts;
	var dir;
	var err;
	if ( !isString( path ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be a string. Value: `%s`.', path ) );
	}
	opts = {};
	if ( arguments.length > 2 ) {
		err = validate( opts, options );
		if ( err ) {
			throw err;
		}
		test = predicate;
	} else {
		test = options;
	}
	if ( !isFunction( test ) ) {
		throw new TypeError( format( 'invalid argument. Last argument must be a function. Value: `%s`.', test ) );
	}
	if ( opts.dir ) {
		dir = resolve( cwd(), opts.dir );
	} else {
		dir = cwd();
	}
	// Start at a base directory and continue moving up through each parent directory until able to resolve a search path or until reaching the root directory...
	while ( child !== dir ) {
		spath = resolve( dir, path );
		if ( exists( spath ) && test( spath ) ) {
			return spath;
		}
		child = dir;
		dir = resolve( dir, '..' );
	}
	return null;
}
Synchronously resolves a path according to a predicate function by walking parent directories.

@param {string} path - path to resolve
@param {Options} [options] - function options
@param {string} [options.dir] - base directory
@param {Function} predicate - callback which tests whether a resolved path passes a test
@throws {TypeError} first argument must be a string
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@throws {TypeError} last argument must be a function
@returns {(string|null)} resolved path or null

@example
function predicate() {
    return true;
}

var path = resolveParentPathBy( 'package.json', predicate );
// e.g., returns '...'