UNPKG

@konker.dev/tiny-rules-fp

Version:

Tiny rules engine based on Effect-ts

34 lines 1.52 kB
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