prioritizeConditions (conditions) {
    const factSets = conditions.reduce((sets, condition) => {
      // if a priority has been set on this specific condition, honor that first
      // otherwise, use the fact's priority
      let priority = condition.priority
      if (!priority) {
        const fact = this.engine.getFact(condition.fact)
        priority = (fact && fact.priority) || 1
      }
      if (!sets[priority]) sets[priority] = []
      sets[priority].push(condition)
      return sets
    }, {})
    return Object.keys(factSets)
      .sort((a, b) => {
        return Number(a) > Number(b) ? -1 : 1 // order highest priority -> lowest
      })
      .map((priority) => factSets[priority])
  }
Priorizes an array of conditions based on "priority"
  When no explicit priority is provided on the condition itself, the condition's priority is determine by its fact
@param  {Condition[]} conditions
@return {Condition[][]} prioritized two-dimensional array of conditions
   Each outer array element represents a single priority(integer).  Inner array is
   all conditions with that priority.