packages feed

phino-0.0.0.49: src/Hide.hs

{-# LANGUAGE RecordWildCards #-}

-- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
-- SPDX-License-Identifier: MIT

module Hide (hide, hide') where

import AST
import Logger (logDebug)
import Misc
import Printer (logPrintConfig, printExpression')
import Rewriter
import Text.Printf (printf)

fqnToAttrs :: Expression -> [Attribute]
fqnToAttrs = reverse . fqnToAttrs'
  where
    fqnToAttrs' :: Expression -> [Attribute]
    fqnToAttrs' (ExDispatch ExGlobal attr) = [attr]
    fqnToAttrs' (ExDispatch expr attr) = attr : fqnToAttrs' expr
    fqnToAttrs' expr = []

hide' :: Program -> [Expression] -> Program
hide' prog [] = prog
hide' (Program expr@(ExFormation _)) (fqn : rest) = hide' (Program (hiddenFormation expr (fqnToAttrs fqn))) rest
  where
    hiddenFormation :: Expression -> [Attribute] -> Expression
    hiddenFormation (ExFormation bds) [attr] =
      let bds' = [bd | bd <- bds, attributeFromBinding bd /= Just attr]
       in ExFormation bds'
    hiddenFormation (ExFormation bds) attrs = ExFormation (hiddenBindings bds attrs)
      where
        hiddenBindings :: [Binding] -> [Attribute] -> [Binding]
        hiddenBindings [] _ = []
        hiddenBindings (bd@(BiTau attr form@(ExFormation _)) : bds) attrs@(attr' : rest)
          | attr == attr' = BiTau attr (hiddenFormation form rest) : bds
          | otherwise = bd : hiddenBindings bds attrs
        hiddenBindings bds _ = bds
    hiddenFormation expr attr = expr
hide' prog (fqn : rest) = prog

hide :: [Rewritten] -> [Expression] -> [Rewritten]
hide [] _ = []
hide (Rewritten {..} : rest) exprs = Rewritten (hide' program exprs) maybeRule : hide rest exprs