@konker.dev/tiny-rules-fp
Version:
Tiny rules engine based on Effect-ts
34 lines • 1.52 kB
JavaScript
import { pipe } from 'effect';
import * as Effect from 'effect/Effect';
//---------------------------------------------------------------------------
// Fact functions
export const createRuleSet = (initialFacts) => ({
facts: initialFacts,
rules: [],
});
export const setFacts = (ruleSet, facts) => ({
...ruleSet,
facts,
});
export const setFact = (key, value) => (facts) => ({ ...facts, [key]: value });
//---------------------------------------------------------------------------
// Rule functions
export const addRule = (rule) => (ruleSet) => ({
...ruleSet,
rules: [...ruleSet.rules, rule],
});
export const addRuleFunc = (factName, ruleFunc, _note = '') => {
const rule = (context, facts) => pipe(Effect.succeed(facts), Effect.map(pipe(ruleFunc(context, facts), (value) => setFact(factName, value))));
return addRule(rule);
};
export const addRuleFuncEffect = (factName, ruleFuncEffect, _note = '') => {
const rule = (context, facts) => pipe(ruleFuncEffect(context, facts), Effect.map((value) => pipe(facts, setFact(factName, value))));
return addRule(rule);
};
export const sequence = (rulesList) => (ruleSet) => {
return rulesList.reduce((acc, ruleTransform) => ruleTransform(acc), ruleSet);
};
//---------------------------------------------------------------------------
// Execution function
export const decide = (context) => (ruleSet) => pipe(ruleSet.rules, Effect.reduce(ruleSet.facts, (facts, rule) => rule(context, facts)));
//# sourceMappingURL=index.js.map