Skip to content

Instantly share code, notes, and snippets.

@jeson114
Last active November 3, 2017 08:11
Show Gist options
  • Save jeson114/8d0b1c07272c3502ee264576ede95960 to your computer and use it in GitHub Desktop.
Save jeson114/8d0b1c07272c3502ee264576ede95960 to your computer and use it in GitHub Desktop.
Recommendation for an object evaluator against a set of rules
//rules: array of objects
////schema : [{fn:somefucnctionDefinition] applies to evaluate()
//schema : [{fn:somefucnctionDefinition,key:bool}] applies only to every and some
//evaluate every - checks for all rules to pass
//evaluate some - checks for atleast one rule to pass
//rule must be a function whose execution results in a truthy or falsy value
//key is set on target as the result of a the evaluate function . the key to be set needs to be passed in rule.key
(function() {
'use strict';
angular
.module('OnCorps.components')
.factory('ObjectAnalysisService', ObjectAnalysisService);
ObjectAnalysisService.$inject = [];
function ObjectAnalysisService() {
var api = {
evaluateEvery: evaluateEvery,
evaluateSome: evaluateSome
};
return api;
function evaluate(rules, target) {
var objectStatus = {};
objectStatus.passed = 0;
objectStatus.failed = 0;
for (var i = 0; i < rules.length; i++) {
if (rules[i].fn(target) === true) {
objectStatus.passed++;
} else {
objectStatus.failed++;
}
}
return objectStatus;
}
function evaluateEvery(rules, target) {
for (var i = 0; i < rules.length; i++) {
if (rules[i].fn(target) === true) {
target[rules[i].key] = rules[i].fn(target);
continue;
} else {
target[rules[i].key] = rules[i].fn(target);
break;
}
}
}
function evaluateSome(rules, target) {
for (var i = 0; i < rules.length; i++) {
if (rules[i].fn(target) === true) {
target[rules[i].key] = rules[i].fn(target);
break;
} else {
target[rules[i].key] = rules[i].fn(target);
continue;
}
}
}
}
})();
@TomEdwards
Copy link

Another alternative:

    function evaluate(rules, target) {
      var objectStatus = {getExtendedStatus:getExtendedStatus};
      var extendedStatus = {pass:[],fail:[]};
      objectStatus.passed = 0;
      objectStatus.failed = 0;
      for (var i = 0; i < rules.length; i++) {
        if (rules[i].fn(target) === true) {
          objectStatus.passed++;
          extendedStatus.pass.push(rules[i]);
        } else {
          objectStatus.failed++;
          extendedStatus.fail.push(rules[i]);
        }
      }
      return objectStatus;
      ////
      function getExtendedStatus() {
        return extendedStatus;
      }
    }

@TomEdwards
Copy link

Suggest rename to ObjectAnalysisService

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment