GrammarProducts-0.1.0.0: FormalLanguage/GrammarProduct/Op/Power.hs
module FormalLanguage.GrammarProduct.Op.Power where
--import Control.Newtype
import Data.Semigroup
import Control.Lens
import Control.Lens.Fold
import Data.Set.Lens
import qualified Data.Set as S
import Data.List (genericReplicate)
import Text.Printf
import FormalLanguage.CFG.Grammar
-- |
power :: Grammar -> Integer -> Grammar
power g k
| k < 1 = error $ "Op.Power.power: power " ++ show k ++ " < 1"
| otherwise = over (rules . setmapped . attr) kAttr
. over (rules . setmapped . rhs . traverse) kDim
. over (rules . setmapped . lhs) kDim
. over start kDim
$ g
where kDim :: Symbol -> Symbol
kDim = Symbol . concat . genericReplicate k . _getSymbolList
kAttr :: [AttributeFunction] -> [AttributeFunction]
kAttr = concat . genericReplicate k
{-
power g k = Grammar ts ns es rs s nm where
ts = g^.tsyms
ns = S.map go $ g^.nsyms
es = g^.epsis
rs = S.map (\(Rule l f rs) -> Rule (go l) (f++f) (map go rs)) $ g^.rules
s = fmap go $ g^.start
nm = concat . genericReplicate k $ g^.name
go (Symb z) = Symb . concat $ genericReplicate k z
-}