Skip to content

Instantly share code, notes, and snippets.

@alexandrebodin
Created July 27, 2016 08:23
Show Gist options
  • Save alexandrebodin/a3d843d811bb76d67363e4767bf72214 to your computer and use it in GitHub Desktop.
Save alexandrebodin/a3d843d811bb76d67363e4767bf72214 to your computer and use it in GitHub Desktop.
const emailSpecification = email => {
const expression = 'user.email === email';
return {
isSatisfiedBy(user) {
return eval(expression);
}
};
};
const u = {
email: 'email@gmail.com',
isActive: false,
};
const isActiveSpecification = {
isSatisfiedBy(user) {
return !!user.isActive;
}
};
const compose = (...specs) => {
const specifications = specs.length === 1 ? specs[0] : specs;
return {
specifications,
operator: 'AND',
isSatisfiedBy(obj) {
for (let i = 0; i < specifications.length ; i++) {
if (!specifications[i].isSatisfiedBy(obj)) return false;
}
return true;
}
}
}
const not = (spec) =>({
spec,
operatior: 'NOT',
isSatisfiedBy(obj) {
return !spec.isSatisfiedBy(obj);
}
});
const and = compose;
const or = (...specs) => {
const specifications = specs.length === 1 ? specs[0] : specs;
return {
specifications,
operator: 'OR',
isSatisfiedBy(obj) {
for (let i = 0; i < specifications.length ; i++) {
if (specifications[i].isSatisfiedBy(obj)) return true;
}
return false;
}
}
}
const finalSpec = compose(
emailSpecification('email@gmail.com'),
not(isActiveSpecification)
);
const finalSpec2 = compose([emailSpecification('email@gmail.com'), isActiveSpecification]);
const finalSpec3 = or(emailSpecification('alex.a'), isActiveSpecification)
const res = emailSpecification('email@gmail.com').isSatisfiedBy(u);
const res1 = finalSpec.isSatisfiedBy(u);
const res2 = finalSpec2.isSatisfiedBy(u);
const res3 = finalSpec3.isSatisfiedBy(u);
console.log(res);
console.log(res1);
console.log(res2);
console.log(res3);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment