packages feed

INblobs-0.1.1: src/INRules.hs

{-| Module     : INRules
    Maitainer  : jmvilaca@di.uminho.pt

    
-}

module INRules
    ( INRules
    , empty

    , updateRule
    , rulesNames
    , findRule
    , fromRule
    , addNewRule
    , addNewEmptyRule
    , removeRule

    , mapRules
    ) where

import INRule
import InfoKind

import Data.List

type INRules g n e = [INRule g n e] 

-- | Empty set of rules.
empty :: (InfoKind e g, InfoKind n g) => g -> n -> e -> INRules g n e
empty g n e = []


updateRule :: String -> (INRule g n e -> INRule g n e) 
               -> INRules g n e -> INRules g n e
updateRule ruleName ruleFunc rules = map f rules 
    where f rule | ruleName == getName rule = ruleFunc rule
                 | otherwise                    = rule

rulesNames :: INRules g n e -> [String]
rulesNames = map getName 

sameName :: String -> INRule g n e -> Bool
sameName ruleName rule = (getName rule) == ruleName

findRule :: String -> INRules g n e -> Maybe (INRule g n e)
findRule ruleName rules = find (sameName ruleName) rules

fromRule :: (INRule g n e -> x) -> String -> INRules g n e -> Maybe x
fromRule func ruleName rules = 
    case findRule ruleName rules of
       Just rule -> Just $ func rule
       Nothing   -> Nothing  

addNewRule :: INRule g n e -> INRules g n e -> INRules g n e
addNewRule newRule rules =  rules ++ [newRule]

addNewEmptyRule :: (InfoKind e g, InfoKind n g) => 
              String -> g -> n -> e -> INRules g n e -> INRules g n e 
addNewEmptyRule ruleName g n e rules = 
   let newRule = setName ruleName $ initial g n e
   in addNewRule newRule rules 

removeRule :: (InfoKind e g, InfoKind n g) => 
              String -> INRules g n e -> INRules g n e
removeRule ruleName rules = filter (not . sameName ruleName) rules

mapRules :: (INRule g n e -> x) -> INRules g n e -> [x]
mapRules = map