30 lines
1.5 KiB
Haskell
30 lines
1.5 KiB
Haskell
module Handler.Utils.Workflow.Restriction
|
|
( checkWorkflowRestriction
|
|
) where
|
|
|
|
import Import
|
|
|
|
import Utils.Workflow
|
|
|
|
import qualified Data.Set as Set
|
|
import qualified Data.Map as Map
|
|
|
|
|
|
checkWorkflowRestriction :: Maybe IdWorkflowState
|
|
-> PredDNF WorkflowGraphRestriction
|
|
-> Bool
|
|
checkWorkflowRestriction mHistory dnf = maybe False (ofoldr1 (||)) . fromNullable $ map evalConj dnf'
|
|
where
|
|
evalConj = maybe True (ofoldr1 (&&)) . fromNullable . map evalPred
|
|
evalPred PLVariable{ plVar = WorkflowGraphRestrictionPayloadFilled{..} } = wgrPayloadFilled `Set.member` filledPayloads
|
|
evalPred PLNegated{ plVar = WorkflowGraphRestrictionPayloadFilled{..} } = wgrPayloadFilled `Set.notMember` filledPayloads
|
|
evalPred PLVariable{ plVar = WorkflowGraphRestrictionPreviousNode{..} } = maybe False (wgrPreviousNode ==) cState
|
|
evalPred PLNegated{ plVar = WorkflowGraphRestrictionPreviousNode{..} } = maybe True (wgrPreviousNode /=) cState
|
|
evalPred PLVariable{ plVar = WorkflowGraphRestrictionInitial } = is _Nothing mHistory
|
|
evalPred PLNegated{ plVar = WorkflowGraphRestrictionInitial } = isn't _Nothing mHistory
|
|
dnf' = map (Set.toList . toNullable) . Set.toList $ dnfTerms dnf
|
|
|
|
filledPayloads | Just history <- mHistory = Map.keysSet . Map.filter (not . Set.null) $ workflowStateCurrentPayloads history
|
|
| otherwise = Set.empty
|
|
cState = wpTo . last <$> mHistory
|