module FormalLanguage.GrammarProduct.Op.Power where
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