function removeObserver(observerState, getter, handler) {
	  var entriesToRemove = observerState.get('observersMap').filter(function (entry) {
	    // use the getterKey in the case of a keyPath is transformed to a getter in addObserver
	    var entryGetter = entry.get('getterKey');
	    var handlersMatch = !handler || entry.get('handler') === handler;
	    if (!handlersMatch) {
	      return false;
	    }
	    // check for a by-value equality of keypaths
	    if ((0, _keyPath.isKeyPath)(getter) && (0, _keyPath.isKeyPath)(entryGetter)) {
	      return (0, _keyPath.isEqual)(getter, entryGetter);
	    }
	    // we are comparing two getters do it by reference
	    return getter === entryGetter;
	  });

	  return observerState.withMutations(function (map) {
	    entriesToRemove.forEach(function (entry) {
	      return removeObserverByEntry(map, entry);
	    });
	  });
	}
Use cases
removeObserver(observerState, [])
removeObserver(observerState, [], handler)
removeObserver(observerState, ['keyPath'])
removeObserver(observerState, ['keyPath'], handler)
removeObserver(observerState, getter)
removeObserver(observerState, getter, handler)
@param {ObserverState} observerState
@param {KeyPath|Getter} getter
@param {Function} handler
@return {ObserverState}