packages feed

ruler-0.4.0.0: src/ARule/PrettyPrintAG.cag

%%[1 ag

-------------------------------------------------------------------------
-- ARule's PP
-------------------------------------------------------------------------

ATTR AllARule AGARuleItf [ | | pp USE {>-<} {empty} : PP_Doc ]

SEM ARule
  | Rule            lhs     .   pp          =   "SEM" >#< pp (head @ndNmL) -- >#< "--" >#< ppCommas' @info
                                                >-< indent atLhs2texDist ("|" >#< @rlNm >|< indent atLhs2texDist @eqns.pp)

SEM AEqn
  | Eqn             lhs     .   pp          =   let (w1,w2) = fromJust @lhs.mbDstWd
                                                    w = w1 + w2 + atDstFillLen
                                                    cmb l r = if @dest.isComposite
                                                              then if @dest.dstWd > w - atLhs2texDist
                                                                   then l >-< strWhite w >|< r
                                                                   else l >|< strWhite (w - @dest.dstWd) >|< r
                                                              else l >|< r
                                                in  cmb @dest.pp ("=" >|< strWhite atLhs2texDist >|< @val.pp)
  | Err             lhs     .   pp          =   "ERR" >#< @expr.pp

SEM AEqnDest
  | Many            lhs     .   pp          =   ppParensCommas @dests.ppL

SEM AExpr
  | Expr            lhs     .   pp          =   exprNeedPar ParCtxtOther nmUnk @expr.self @expr.pp

SEM AEqnDests [ | | ppL: {[PP_Doc]} ]
  | Cons            lhs     .   ppL         =   @hd.pp : @tl.ppL
  | Nil             lhs     .   ppL         =   []

-------------------------------------------------------------------------
-- Context of ANm
-------------------------------------------------------------------------

SEM AEqnDest
  | One             anm     .   isDest      =   True

-------------------------------------------------------------------------
-- ARule max column width info, for tabular like PP
-------------------------------------------------------------------------

ATTR AllARuleButARule [ mbDstWd: {Maybe (Int,Int)} | | mxDstNdWd, mxDstAtWd USE {`max`} {0}: Int ]

SEM ARule
  | Rule            loc     .   mbDstWd     =   Just (@eqns.mxDstNdWd,@eqns.mxDstAtWd)

SEM AEqnDest
  | Many            dests   .   mbDstWd     =   Nothing

-------------------------------------------------------------------------
-- ARule dest width info, for lining up multidestination AEqn
-------------------------------------------------------------------------

ATTR AEqnDest [ | | dstWd: Int ]
ATTR AEqnDests [ | | dstWdL: {[Int]} ]

SEM AEqnDest
  | Many            lhs     .   dstWd       =   sum @dests.dstWdL + length @dests.dstWdL + 1
  | One             lhs     .   dstWd       =   @anm.mxDstNdWd + @anm.mxDstAtWd + (if @anm.mxDstNdWd > 0 then 1 else 0)

SEM AEqnDests
  | Cons            lhs     .   dstWdL      =   @hd.dstWd : @tl.dstWdL
  | Nil             lhs     .   dstWdL      =   []

-------------------------------------------------------------------------
-- Node name of AEqnDest in an AEqn, for emitting only first of a series of same node names
-------------------------------------------------------------------------

ATTR AEqnDest AEqn [ | | ndStr: String ]
ATTR AEqnDest AEqn AEqns [ mbPrevNdStr: {Maybe String} | | ]

SEM AEqnDest
  | Many            lhs     .   ndStr       =   "??"

SEM AEqn
  | Err             lhs     .   ndStr       =   "??"

SEM AEqns
  | Cons            tl      .   mbPrevNdStr =   fmap (const @hd.ndStr) @lhs.mbDstWd

SEM ARule
  | Rule            loc     .   mbPrevNdStr =   Nothing

SEM AEqnDests
  | Cons            loc     .   mbPrevNdStr =   Nothing

SEM AEqnDest
  | Many            loc     .   mbPrevNdStr =   Nothing

-------------------------------------------------------------------------
-- Kind of lhs of eqn, composite?
-------------------------------------------------------------------------

ATTR AEqnDest [ | | isComposite: Bool ]

SEM AEqnDest
  | Many            lhs     .   isComposite =   True
  | One             lhs     .   isComposite =   False

%%]