function groupIn( obj, opts, indicator ) {
	var thisArg;
	var out;
	var key;
	var g;

	thisArg = opts.thisArg;
	out = {};
	for ( key in obj ) { // eslint-disable-line guard-for-in
		g = indicator.call( thisArg, obj[ key ], key );
		if ( hasOwnProp( out, g ) ) {
			out[ g ].push( key );
		} else {
			out[ g ] = [ key ];
		}
	}
	return out;
}
Groups values according to an indicator function and outputs results as keys.

@private
@param {(Object|Array|TypedArray)} obj - input object
@param {Options} opts - function options
@param {*} [opts.thisArg] - execution context
@param {Function} indicator - indicator function specifying which group an element in the input object belongs to
@returns {Object} results

@example
function indicator( v ) {
    return v[ 0 ];
}

function Foo() {
    this.a = 'beep';
    this.b = 'boop';
    return this;
}

Foo.prototype = Object.create( null );
Foo.prototype.c = 'foo';
Foo.prototype.d = 'bar';

var obj = new Foo();

var out = groupIn( obj, {}, indicator );
// e.g., returns { 'b': [ 'a', 'b', 'd' ], 'f': [ 'c' ] }