evaluateRules (ruleArray, almanac) {
    return Promise.all(ruleArray.map((rule) => {
      if (this.status !== RUNNING) {
        debug('engine::run, skipping remaining rules', { status: this.status })
        return Promise.resolve()
      }
      return rule.evaluate(almanac).then((ruleResult) => {
        debug('engine::run', { ruleResult: ruleResult.result })
        almanac.addResult(ruleResult)
        if (ruleResult.result) {
          almanac.addEvent(ruleResult.event, 'success')
          return this.emitAsync('success', ruleResult.event, almanac, ruleResult)
            .then(() => this.emitAsync(ruleResult.event.type, ruleResult.event.params, almanac, ruleResult))
        } else {
          almanac.addEvent(ruleResult.event, 'failure')
          return this.emitAsync('failure', ruleResult.event, almanac, ruleResult)
        }
      })
    }))
  }
Runs an array of rules
@param  {Rule[]} array of rules to be evaluated
@return {Promise} resolves when all rules in the array have been evaluated