docs: function combineAnds(ands) {
  	var firstKeys = Object.keys(ands[0].values);
  	var keys = {};
  
  	var keysCompare = new is.In(firstKeys);
  
  	firstKeys.map(function(key) {
  		keys[key] = [];
  	});
  
  	var sameKeys = ands.every(function(and) {
  		// have to have the same keys
  		if (!set.isEqual(keysCompare, new is.In(Object.keys(and.values)))) {
  			return false;
  		}
  		canReflect.eachKey(and.values, function(value, key) {
  			keys[key].push(value);
  		});
  		return true;
  	});
  	if (!sameKeys) {
  		return;
  	}
  	// now try to union everything and see if it simplifies ...
  	var unequalKeys = [];
  	firstKeys.forEach(function(key) {
  		var isEqual = keys[key].reduce(function(newSet, lastSetOrFalse) {
  			if (lastSetOrFalse === false) {
  				return false;
  			}
  			if (lastSetOrFalse === undefined) {
  				return newSet;
  			}
  			var res = set.isEqual(newSet, lastSetOrFalse);
  			return res ? newSet : false;
  		});
  		if (!isEqual) {
  			unequalKeys.push(key);
  		}
  	});
  
  	if (unequalKeys.length !== 1) {
  		return;
  	}
  	var unionKey = unequalKeys[0];
  	// lets see if we can union that one value
  	var unioned = keys[unionKey].reduce(function(cur, last) {
  		return set.union(cur, last);
  	}, set.EMPTY);
  
  	var result = {};
  	firstKeys.map(function(key) {
  		result[key] = keys[key][0];
  	});
  	result[unionKey] = unioned;
  	return new BasicQuery.KeysAnd(result);
  }