lib: put conditionalblockp pasrser first as it is a more common case

This commit is contained in:
Dmitry Astapov 2020-06-22 19:00:00 +01:00 committed by Simon Michael
parent ed01e57b23
commit 8844ef1b5f

View File

@ -410,14 +410,14 @@ DIGIT: 0-9
rulesp :: CsvRulesParser CsvRules rulesp :: CsvRulesParser CsvRules
rulesp = do rulesp = do
_ <- many $ choice _ <- many $ choice
[blankorcommentlinep <?> "blank or comment line" [blankorcommentlinep <?> "blank or comment line"
,(directivep >>= modify' . addDirective) <?> "directive" ,(directivep >>= modify' . addDirective) <?> "directive"
,(fieldnamelistp >>= modify' . setIndexesAndAssignmentsFromList) <?> "field name list" ,(fieldnamelistp >>= modify' . setIndexesAndAssignmentsFromList) <?> "field name list"
,(fieldassignmentp >>= modify' . addAssignment) <?> "field assignment" ,(fieldassignmentp >>= modify' . addAssignment) <?> "field assignment"
-- conditionaltablep backtracks because it shares "if" prefix with conditionalblockp and the -- conditionalblockp backtracks because it shares "if" prefix with conditionaltablep.
-- reverse is there to ensure that conditions are added in the order they listed in the file ,try (conditionalblockp >>= modify' . addConditionalBlock) <?> "conditional block"
,try (conditionaltablep >>= modify' . addConditionalBlocks . reverse) <?> "conditional table" -- 'reverse' is there to ensure that conditions are added in the order they listed in the file
,(conditionalblockp >>= modify' . addConditionalBlock) <?> "conditional block" ,(conditionaltablep >>= modify' . addConditionalBlocks . reverse) <?> "conditional table"
] ]
eof eof
r <- get r <- get
@ -1141,7 +1141,7 @@ getEffectiveAssignment rules record f = lastMay $ map snd $ assignments
-- all top level field assignments -- all top level field assignments
toplevelassignments = rassignments rules toplevelassignments = rassignments rules
-- all field assignments in conditional blocks assigning to field f and active for the current csv record -- all field assignments in conditional blocks assigning to field f and active for the current csv record
conditionalassignments = concatMap cbAssignments $ filter isBlockActive $ rblocksassigning rules f conditionalassignments = concatMap cbAssignments $ filter isBlockActive $ (rblocksassigning rules) f
where where
-- does this conditional block match the current csv record ? -- does this conditional block match the current csv record ?
isBlockActive :: ConditionalBlock -> Bool isBlockActive :: ConditionalBlock -> Bool