Skip to content

Commit

Permalink
Rule Engine scaffold
Browse files Browse the repository at this point in the history
  • Loading branch information
= committed Sep 11, 2015
1 parent 6a3ad99 commit 223c7be
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
13 changes: 13 additions & 0 deletions Main.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Main where

import RuleEngine

main = do
let operator = InsideOp (4::Int)
let coupleValue = CoupleVal (2::Int) (5::Int)
let boxing = Template coupleValue operator
let condition = Condition "Alaintérieure" boxing
let rule = addEvaluable (Rule []) condition
let ruleEngine = addRule (RuleEngine []) rule

print (evalRuleEngine ruleEngine)
84 changes: 84 additions & 0 deletions RuleEngine.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}

module RuleEngine
(
-- Operators
InsideOp(InsideOp),
InferiorOp(InferiorOp),

-- Template data
Unival(Unival),
CoupleVal(CoupleVal),

-- Template (data + operator)
Template(Template),

-- Condition
Condition(Condition),

EvalTemplate(evalTemplate),

-- Rule
Rule(Rule),
addEvaluable,
evalRule,

-- RuleEngine
RuleEngine(RuleEngine),
addRule,
evalRuleEngine
) where

-- Operators

data InsideOp e = InsideOp e
data InferiorOp e = InferiorOp e

-- Template data

data Unival x = Unival x
data CoupleVal x = CoupleVal x x

-- Template (data + operator)
data Template dat op = Template dat op

-- Condition

data Condition evaluable = Condition String evaluable

-- Eval type classe

class EvalTemplate val op where
evalTemplate :: val -> op -> Bool

class EvalCondition e where
evalCondition :: e -> Bool

instance EvalTemplate (Unival e) (InsideOp i) where
evalTemplate val op = True

instance Ord(x) => EvalTemplate (CoupleVal x) (InsideOp x) where
evalTemplate (CoupleVal x1 x2) (InsideOp ins) = ins >= x1 && ins <= x2

instance (EvalTemplate dat op) => EvalCondition (Condition (Template dat op)) where
evalCondition (Condition str (Template v o)) = evalTemplate v o

-- Rule

data Rule evaluable = Rule [evaluable]

addEvaluable :: EvalCondition(e) => Rule e -> e -> Rule e
addEvaluable (Rule lst) val = Rule (val : lst)

evalRule :: EvalCondition(e) => (Rule e) -> Bool
evalRule (Rule evaluables) = foldr (\elem b -> evalCondition(elem) && b) True evaluables

-- Rule Engine

data RuleEngine evaluable = RuleEngine [Rule evaluable]

addRule :: EvalCondition(evaluable) => RuleEngine evaluable -> Rule evaluable -> RuleEngine evaluable
addRule (RuleEngine ruleList) rule = RuleEngine (rule : ruleList)

evalRuleEngine :: EvalCondition(evaluable) => RuleEngine evaluable -> Bool
evalRuleEngine (RuleEngine rules) = foldr (\rule b -> evalRule(rule) && b) True rules

0 comments on commit 223c7be

Please sign in to comment.