{-# Language FlexibleInstances, RankNTypes, RecordWildCards, TemplateHaskell #-}
module Test.Ambiguous where

import Control.Applicative ((<|>), empty, liftA2)
import Data.Foldable (fold)
import Data.Semigroup ((<>))

import qualified Rank2.TH
import Text.Grampa
import Text.Grampa.Combinators
import Text.Grampa.ContextFree.LeftRecursive (Parser)

import Debug.Trace

data Amb = Xy1 String String
         | Xy2 (Ambiguous Amb) String
         | Xyz (Ambiguous Amb) String
         | Xyzw (Ambiguous Amb) String
         deriving (Eq, Show)

data Test p = Test{
   amb :: p (Ambiguous Amb)
   }

grammar :: Test (Parser Test String) -> Test (Parser Test String)
grammar Test{..} = Test{
   amb = ambiguous (Xy1 <$> string "x" <*> moptional (string "y")
                    <|> Xy2 <$> amb <*> string "y"
                    <|> Xyz <$> amb <*> string "z"
                    <|> Xyzw <$> amb <*> string "w")
   }

instance Lexical Test

$(Rank2.TH.deriveAll ''Test)