evaluate (almanac, operatorMap) {
    if (!almanac) return Promise.reject(new Error('almanac required'))
    if (!operatorMap) return Promise.reject(new Error('operatorMap required'))
    if (this.isBooleanOperator()) { return Promise.reject(new Error('Cannot evaluate() a boolean condition')) }

    const op = operatorMap.get(this.operator)
    if (!op) { return Promise.reject(new Error(`Unknown operator: ${this.operator}`)) }

    return Promise.all([
      almanac.getValue(this.value),
      almanac.factValue(this.fact, this.params, this.path)
    ]).then(([rightHandSideValue, leftHandSideValue]) => {
      const result = op.evaluate(leftHandSideValue, rightHandSideValue)
      debug(
        'condition::evaluate', {
          leftHandSideValue,
          operator: this.operator,
          rightHandSideValue,
          result
        }
      )
      return {
        result,
        leftHandSideValue,
        rightHandSideValue,
        operator: this.operator
      }
    })
  }
Takes the fact result and compares it to the condition 'value', using the operator
  LHS                      OPER       RHS
<fact + params + path>  <operator>  <value>

@param   {Almanac} almanac
@param   {Map} operatorMap - map of available operators, keyed by operator name
@returns {Boolean} - evaluation result