module GLL.Combinators.Visit.Grammar where

import GLL.Types.Grammar

import qualified Data.Map as M

type Grammar_Expr t = M.Map Nt [Prod t] -> M.Map Nt [Prod t]

grammar_nterm :: Nt -> [Prod t] -> [Grammar_Expr t] -> Grammar_Expr t
grammar_nterm x alts ps rules 
    | x `M.member` rules = rules
    | otherwise = foldr ($) (M.insert x alts rules) $ ps 

grammar_apply :: Grammar_Expr t -> Grammar_Expr t
grammar_apply = id

grammar_seq :: Grammar_Expr t -> Grammar_Expr t -> Grammar_Expr t
grammar_seq p q rules =
    let rules1  = q rules
        rules2  = p rules1 in rules2