never executed always true always false
1 module HelVM.HelMA.Automaton.Optimizer.MarkRemovingOptimizer
2 ( makrRemoving
3 ) where
4
5 import HelVM.HelMA.Automaton.Instruction
6
7 import HelVM.HelMA.Automaton.Instruction.Extras.Constructors
8 import HelVM.HelMA.Automaton.Instruction.Extras.Patterns
9
10 import qualified Data.Set as Set
11
12 makrRemoving ∷ InstructionList → InstructionList
13 makrRemoving il = mapMaybe (makrRemovingWithSet set) il where set = consValueSet il
14
15 makrRemovingWithSet ∷ Set Integer → Instruction → Maybe Instruction
16 makrRemovingWithSet set (MNaturalP i) = mark set i
17 makrRemovingWithSet _ i = Just i
18
19 mark ∷ Set.Set Integer → Natural → Maybe Instruction
20 mark set i = build $ Set.member (fromIntegral i) set where
21 build True = Just $ markNI i
22 build False = Nothing
23
24 consValueSet ∷ InstructionList → Set.Set Integer
25 consValueSet il = fromList $ mapMaybe consValueOpt il
26
27 consValueOpt ∷ Instruction → Maybe Integer
28 consValueOpt (ConsP i) = Just i
29 consValueOpt _ = Nothing