Skip to content

Commit 4e91cd0

Browse files
committed
mergeRules: WIP clean-up
1 parent b350f9e commit 4e91cd0

File tree

1 file changed

+52
-72
lines changed

1 file changed

+52
-72
lines changed

kore/src/Kore/Exec.hs

Lines changed: 52 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ import Control.DeepSeq
2828
( deepseq
2929
)
3030
import Control.Error
31-
( note
32-
, runMaybeT
31+
( runMaybeT
3332
)
3433
import qualified Control.Lens as Lens
3534
import Control.Monad
@@ -38,10 +37,21 @@ import Control.Monad
3837
import Control.Monad.Catch
3938
( MonadMask
4039
)
40+
import Control.Monad.Trans.Except
41+
( ExceptT
42+
, runExceptT
43+
, throwE
44+
)
4145
import Data.Coerce
4246
( coerce
4347
)
4448
import qualified Data.Foldable as Foldable
49+
import Data.Generics.Product
50+
( field
51+
)
52+
import Data.Generics.Wrapped
53+
( _Unwrapped
54+
)
4555
import qualified Data.List as List
4656
import qualified Data.Map.Strict as Map
4757
import Data.Text
@@ -545,85 +555,55 @@ mergeRules
545555
-- ^ The list of rules to merge
546556
-> smt (Either Text [RewriteRule VariableName])
547557
mergeRules ruleMerger verifiedModule ruleNames =
548-
evalSimplifier verifiedModule $ do
558+
evalSimplifier verifiedModule $ runExceptT $ do
549559
initialized <- initialize verifiedModule
550560
let Initialized { rewriteRules } = initialized
561+
rewriteRules' = unRewritingRule <$> rewriteRules
562+
rules <- extractRules rewriteRules' ruleNames
563+
lift $ ruleMerger rules
551564

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?
564566
extractRules
565-
:: [RewriteRule VariableName]
567+
:: forall m
568+
. Monad m
569+
=> [RewriteRule VariableName]
566570
-> [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)
576581

582+
where
583+
-- TODO: more clean-up
577584
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)
586588

587589
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)
627607

628608
assertSingleClaim :: Monad m => [claim] -> m ()
629609
assertSingleClaim claims =

0 commit comments

Comments
 (0)