ruler-0.4.0.0: src/ARule/PatternUniq.cag
-------------------------------------------------------------------------
-- Interfacing to ARule:
-------------------------------------------------------------------------
%%[1 hs module (ARule.PatternUniq)
%%]
%%[1 hs export (arlUniq)
%%]
%%[1 hs import (qualified Data.Set as Set, Common, Opts, ARule.ARule, Expr.Expr, FmGam, ARule.RwSubst)
%%]
%%[1 ag import ({Expr/AbsSynAG}, {ARule/AbsSynAG}, {Expr/OptsAG}, {ARule/OptsAG}, {Expr/FmGamAG}, {ARule/FmGamAG}, {ARule/CopyRuleNmAG})
%%]
%%[1 ag
WRAPPER AGARuleItf
%%]
%%[1 hs
arlUniq :: FmGam Expr -> [Nm] -> ARule -> ARule
arlUniq fg co rl
= replUniq_Syn_AGARuleItf r2
where r1 = sem_AGARuleItf (AGARuleItf_AGItf rl)
r2 = wrap_AGARuleItf r1
(Inh_AGARuleItf {opts_Inh_AGARuleItf = defaultOpts
,croNmL_Inh_AGARuleItf = co
,fmGam_Inh_AGARuleItf = fg
})
%%]
-------------------------------------------------------------------------
-- Uniq sequence nr
-------------------------------------------------------------------------
%%[1 ag
ATTR AllARuleButARule AllExpr [ | uniqSeqNr: Int | ]
SEM ARule
| Rule eqns . uniqSeqNr = 0
SEM Expr
| Uniq loc . uniqSeqNr = @lhs.uniqSeqNr + 1
lhs . uniqSeqNr = @uniqSeqNr
SEM AGExprItf
| AGItf loc . uniqSeqNr = 0
%%]
-------------------------------------------------------------------------
-- Uniq name
-------------------------------------------------------------------------
%%[1 ag
SEM Expr
| Uniq loc . nm = fmNmUniq @lhs.opts @lhs.fmGam @uniqSeqNr
%%]
-------------------------------------------------------------------------
-- Node to which uniq thread must be passed
-------------------------------------------------------------------------
%%[1 ag
ATTR AllARuleRule [ uniqThrDst: ANm | | ]
SEM AGARuleItf
| AGItf rule . uniqThrDst = case @lhs.croNmL of
(_:[d]) -> ANm_Lhs (fmNmUniq @lhs.opts @lhs.fmGam 0) []
(_:d:_) -> ANm_Node d (fmNmUniq @lhs.opts @lhs.fmGam 0)
%%]
-------------------------------------------------------------------------
-- Construction of AEqn for uniq's
-------------------------------------------------------------------------
%%[1 ag
SEM ARule
| Rule loc . mkUniqEqnL = if @eqns.uniqSeqNr > 0
then [AEqn_Eqn
(AEqnDest_Many
(map AEqnDest_One
(@lhs.uniqThrDst : [ ANm_Loc (fmNmUniq @lhs.opts @lhs.fmGam u) [] | u <- [1 .. @eqns.uniqSeqNr] ])
)
)
(AExpr_Expr
(mkExprApp (exprSubst (@lhs.opts {optGenFM = FmFmtCmd}) @lhs.fmGam . Expr_Var . nmFunMkUniq $ @eqns.uniqSeqNr)
[mkALhs (fmNmUniq @lhs.opts @lhs.fmGam 0)]
)
)
]
else []
%%]
-------------------------------------------------------------------------
-- Replica
-------------------------------------------------------------------------
%%[1 ag
ATTR AllARule AllExpr [ | | replUniq: SELF ]
ATTR AGARuleItf [ | | replUniq: ARule ]
SEM ARule
| Rule lhs . replUniq = ARule_Rule @ndNmL @rlNm @info (@mkUniqEqnL ++ @eqns.replUniq)
SEM Expr
| Uniq lhs . replUniq = mkALoc @nm
%%]