ruler-0.4.0.0: src/Expr/CoGam.cag
-------------------------------------------------------------------------
-- Expr child order
-------------------------------------------------------------------------
%%[1 hs module (Expr.CoGam)
%%]
%%[1 hs export (module Gam, ChOrdGam, exprCoGam, coGamNmL)
%%]
%%[1 hs import (Data.List, qualified Data.Map as Map, Common, Expr.Expr, Gam)
%%]
%%[1 ag import ({Expr/AbsSynAG})
%%]
%%[1 ag
WRAPPER AGExprItf
%%]
%%[1 hs
exprCoGam :: Expr -> ChOrdGam
exprCoGam e
= coGam_Syn_AGExprItf r2
where r1 = sem_AGExprItf (AGExprItf_AGItf e)
r2 = wrap_AGExprItf r1
(Inh_AGExprItf)
%%]
-------------------------------------------------------------------------
-- Child order
-------------------------------------------------------------------------
%%[1 hs
type ChOrdGam = Gam Nm Int
%%]
-------------------------------------------------------------------------
-- Child order as list of names
-------------------------------------------------------------------------
%%[1 hs
coGamNmL :: ChOrdGam -> [Nm]
coGamNmL coGam
= [nmLhs] ++ l ++ [nmLhs]
where l = map fst . sortBy (\(_,o1) (_,o2) -> compare o1 o2) . gamAssocsShadow $ coGam
%%]
-------------------------------------------------------------------------
-- Expr child order
-------------------------------------------------------------------------
%%[1 ag
ATTR AllExpr ANm AGExprItf [ | | coGam USE {`gamUnion`} {emptyGam}: ChOrdGam ]
ATTR Expr ANm [ | | mbChNm: {Maybe Nm} ]
SEM ANm
| Fld lhs . mbChNm = Just @nm
| * - Fld lhs . mbChNm = Nothing
SEM Expr
| * - AVar lhs . mbChNm = Nothing
SEM Expr
| ChildOrder lhs . coGam = case @expr.mbChNm of
Just n -> gamSingleton n @seqNr
Nothing -> emptyGam
%%]