@@ -28,8 +28,7 @@ import Control.DeepSeq
28
28
( deepseq
29
29
)
30
30
import Control.Error
31
- ( note
32
- , runMaybeT
31
+ ( runMaybeT
33
32
)
34
33
import qualified Control.Lens as Lens
35
34
import Control.Monad
@@ -38,10 +37,21 @@ import Control.Monad
38
37
import Control.Monad.Catch
39
38
( MonadMask
40
39
)
40
+ import Control.Monad.Trans.Except
41
+ ( ExceptT
42
+ , runExceptT
43
+ , throwE
44
+ )
41
45
import Data.Coerce
42
46
( coerce
43
47
)
44
48
import qualified Data.Foldable as Foldable
49
+ import Data.Generics.Product
50
+ ( field
51
+ )
52
+ import Data.Generics.Wrapped
53
+ ( _Unwrapped
54
+ )
45
55
import qualified Data.List as List
46
56
import qualified Data.Map.Strict as Map
47
57
import Data.Text
@@ -545,85 +555,55 @@ mergeRules
545
555
-- ^ The list of rules to merge
546
556
-> smt (Either Text [RewriteRule VariableName ])
547
557
mergeRules ruleMerger verifiedModule ruleNames =
548
- evalSimplifier verifiedModule $ do
558
+ evalSimplifier verifiedModule $ runExceptT $ do
549
559
initialized <- initialize verifiedModule
550
560
let Initialized { rewriteRules } = initialized
561
+ rewriteRules' = unRewritingRule <$> rewriteRules
562
+ rules <- extractRules rewriteRules' ruleNames
563
+ lift $ ruleMerger rules
551
564
552
- let nonEmptyRules :: Either Text (NonEmpty (RewriteRule VariableName ))
553
- nonEmptyRules = do
554
- let rewriteRules' = unRewritingRule <$> rewriteRules
555
- rules <- extractRules rewriteRules' ruleNames
556
- case rules of
557
- [] -> Left " Empty rule list."
558
- (r : rs) -> Right (r :| rs)
559
-
560
- case nonEmptyRules of
561
- (Left left) -> return (Left left)
562
- (Right rules) -> Right <$> ruleMerger rules
563
-
565
+ -- TODO: what if a label name and an id name coincide?
564
566
extractRules
565
- :: [RewriteRule VariableName ]
567
+ :: forall m
568
+ . Monad m
569
+ => [RewriteRule VariableName ]
566
570
-> [Text ]
567
- -> Either Text [RewriteRule VariableName ]
568
- extractRules rules = foldr addExtractRule (Right [] )
569
- where
570
- addExtractRule
571
- :: Text
572
- -> Either Text [RewriteRule VariableName ]
573
- -> Either Text [RewriteRule VariableName ]
574
- addExtractRule ruleName processedRules =
575
- (:) <$> extractRule ruleName <*> processedRules
571
+ -> ExceptT Text m (NonEmpty (RewriteRule VariableName ))
572
+ extractRules rules names = do
573
+ -- TODO: assert unique names
574
+ let rulesById = mapMaybe ruleById rules
575
+ rulesByLabel = mapMaybe ruleByLabel rules
576
+ ruleRegistry = Map. fromList (rulesById <> rulesByLabel)
577
+ extractedRules <- traverse (extractRule ruleRegistry) names
578
+ case extractedRules of
579
+ [] -> throwE " Empty rule list."
580
+ (r : rs) -> return (r :| rs)
576
581
582
+ where
583
+ -- TODO: more clean-up
577
584
maybeRuleUniqueId :: RewriteRule VariableName -> Maybe Text
578
- maybeRuleUniqueId
579
- (RewriteRule RulePattern
580
- { attributes = Attribute. Axiom
581
- { uniqueId = Attribute. UniqueId maybeName }
582
- }
583
- )
584
- =
585
- maybeName
585
+ maybeRuleUniqueId =
586
+ Lens. view
587
+ (_Unwrapped . field @ " attributes" . field @ " uniqueId" . _Unwrapped)
586
588
587
589
maybeRuleLabel :: RewriteRule VariableName -> Maybe Text
588
- maybeRuleLabel
589
- (RewriteRule RulePattern
590
- { attributes = Attribute. Axiom
591
- { label = Attribute. Label maybeName }
592
- }
593
- )
594
- =
595
- maybeName
596
-
597
- idRules :: [RewriteRule VariableName ] -> [(Text , RewriteRule VariableName )]
598
- idRules = mapMaybe namedRule
599
- where
600
- namedRule rule = do
601
- name <- maybeRuleUniqueId rule
602
- return (name, rule)
603
-
604
- labelRules :: [RewriteRule VariableName ] -> [(Text , RewriteRule VariableName )]
605
- labelRules = mapMaybe namedRule
606
- where
607
- namedRule rule = do
608
- name <- maybeRuleLabel rule
609
- return (name, rule)
610
-
611
- rulesByName :: Map. Map Text (RewriteRule VariableName )
612
- rulesByName = Map. union
613
- (Map. fromListWith
614
- (const $ const $ error " duplicate rule" )
615
- (idRules rules)
616
- )
617
- (Map. fromListWith
618
- (const $ const $ error " duplicate rule" )
619
- (labelRules rules)
620
- )
621
-
622
- extractRule :: Text -> Either Text (RewriteRule VariableName )
623
- extractRule ruleName =
624
- note
625
- (" Rule not found: '" <> ruleName <> " '." )
626
- (Map. lookup ruleName rulesByName)
590
+ maybeRuleLabel =
591
+ Lens. view
592
+ (_Unwrapped . field @ " attributes" . field @ " label" . _Unwrapped)
593
+
594
+ ruleById rule = do
595
+ name <- maybeRuleUniqueId rule
596
+ return (name, rule)
597
+
598
+ ruleByLabel rule = do
599
+ name <- maybeRuleLabel rule
600
+ return (name, rule)
601
+
602
+ extractRule registry ruleName =
603
+ maybe
604
+ (throwE $ " Rule not found: '" <> ruleName <> " '." )
605
+ return
606
+ (Map. lookup ruleName registry)
627
607
628
608
assertSingleClaim :: Monad m => [claim ] -> m ()
629
609
assertSingleClaim claims =
0 commit comments