packages feed

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

%%]