module Text.GrammarCombinators.Transform.FilterDies (
filterDies,
filterDiesP,
filterDiesE,
filterDiesPE,
filterDiesLE
) where
import Text.GrammarCombinators.Base
data FilterDiesRule p (phi :: * -> *) (r :: * -> *) t v =
FDBaseRule (p v)
| FDDieRule
instance ProductionRule p =>
ProductionRule (FilterDiesRule p phi r t) where
endOfInput = FDBaseRule endOfInput
FDDieRule >>> _ = FDDieRule
_ >>> FDDieRule = FDDieRule
(FDBaseRule ra) >>> (FDBaseRule rb) = FDBaseRule $ ra >>> rb
FDDieRule ||| rb = rb
(FDBaseRule ra) ||| fdrb =
FDBaseRule $ case fdrb of FDDieRule -> ra
(FDBaseRule rb) -> ra ||| rb
die = FDDieRule
instance (EpsProductionRule p) =>
EpsProductionRule (FilterDiesRule p phi r t) where
epsilon = FDBaseRule . epsilon
instance (LiftableProductionRule p) =>
LiftableProductionRule (FilterDiesRule p phi r t) where
epsilonL v q = FDBaseRule $ epsilonL v q
instance (TokenProductionRule p t) =>
TokenProductionRule (FilterDiesRule p phi r t) t where
token = FDBaseRule . token
anyToken = FDBaseRule anyToken
instance (RecProductionRule p phi r) =>
RecProductionRule (FilterDiesRule p phi r t) phi r where
ref = FDBaseRule . ref
instance (PenaltyProductionRule p) =>
PenaltyProductionRule (FilterDiesRule p phi r t) where
penalty _ FDDieRule = FDDieRule
penalty _ (FDBaseRule _) = FDDieRule
instance (LoopProductionRule p phi r) =>
LoopProductionRule (FilterDiesRule p phi r t) phi r where
manyRef = FDBaseRule . manyRef
many1Ref = FDBaseRule . many1Ref
runFDRule :: (ProductionRule p) =>
FilterDiesRule p phi r t v -> p v
runFDRule FDDieRule = die
runFDRule (FDBaseRule r) = r
filterDies :: forall phi t r rr.
GContextFreeGrammar phi t r rr ->
GContextFreeGrammar phi t r rr
filterDies gram idx = runFDRule $ gram idx
filterDiesP :: forall phi t r rr.
GPenaltyContextFreeGrammar phi t r rr ->
GPenaltyContextFreeGrammar phi t r rr
filterDiesP gram idx = runFDRule $ gram idx
filterDiesE :: forall phi t r rr.
GExtendedContextFreeGrammar phi t r rr ->
GExtendedContextFreeGrammar phi t r rr
filterDiesE gram idx = runFDRule $ gram idx
filterDiesPE :: forall phi t r rr.
GPenaltyExtendedContextFreeGrammar phi t r rr ->
GPenaltyExtendedContextFreeGrammar phi t r rr
filterDiesPE gram idx = runFDRule $ gram idx
filterDiesLE :: forall phi t r rr.
GLExtendedContextFreeGrammar phi t r rr ->
GLExtendedContextFreeGrammar phi t r rr
filterDiesLE gram idx = runFDRule $ gram idx