function evaluate(reactorState, keyPathOrGetter) {
	  var state = reactorState.get('state');

	  if ((0, _keyPath.isKeyPath)(keyPathOrGetter)) {
	    // if its a keyPath simply return
	    return evaluateResult(state.getIn(keyPathOrGetter), reactorState);
	  } else if (!(0, _getter.isGetter)(keyPathOrGetter)) {
	    throw new Error('evaluate must be passed a keyPath or Getter');
	  }

	  // Must be a Getter

	  var cache = reactorState.get('cache');
	  var cacheEntry = cache.lookup(keyPathOrGetter);
	  var isCacheMiss = !cacheEntry || isDirtyCacheEntry(reactorState, cacheEntry);
	  if (isCacheMiss) {
	    cacheEntry = createCacheEntry(reactorState, keyPathOrGetter);
	  }

	  return evaluateResult(cacheEntry.get('value'), reactorState.update('cache', function (cache) {
	    return isCacheMiss ? cache.miss(keyPathOrGetter, cacheEntry) : cache.hit(keyPathOrGetter);
	  }));
	}
@param {ReactorState} reactorState
@param {KeyPath|Gettter} keyPathOrGetter
@return {EvaluateResult}