module Language.Grammars.ZipperAG.Examples.LET.Let_Bidi where
import Data.Generics.Zipper
import Language.Grammars.ZipperAG
import Language.Grammars.ZipperAG.Examples.LET.Let_DataTypes_Boilerplate
getRootC_RootA :: Zipper a -> RootA
getRootC_RootA ag = case (constructor ag) of
"RootC" -> RootA (getLetC_LetA $ ag.$1) (createLink ag)
getLetC_LetA :: Zipper a -> LetA
getLetC_LetA ag = case (constructor ag) of
"LetC" -> LetA (getListC_ListA $ ag.$1) (getInC_IntA $ ag.$2) (createLink ag)
getInC_IntA :: Zipper a -> InA
getInC_IntA ag = case (constructor ag) of
"InC" -> InA (getE_A $ ag.$1) (createLink ag)
getListC_ListA :: Zipper a -> ListA
getListC_ListA ag = case (constructor ag) of
"ConsLetC" -> ConsLetA (lexeme_ConsLetC ag) (getLetC_LetA $ ag.$2) (getListC_ListA $ ag.$3) (createLink ag)
"ConsAssignC" -> ConsAssignA (lexeme_ConsAssignC ag) (getE_A $ ag.$2) (getListC_ListA $ ag.$3) (createLink ag)
"EmptyListC" -> EmptyListA (createLink ag)
getE_A :: Zipper a -> A
getE_A ag = case (constructor ag) of
"Add" -> Plus (getE_A $ ag.$1) (getT_A $ ag.$2) (createLink ag)
"Sub" -> Minus (getE_A $ ag.$1) (getT_A $ ag.$2) (createLink ag)
"Et" -> getT_A $ ag.$1
getT_A :: Zipper a -> A
getT_A ag = case (constructor ag) of
"Mul" -> Time (getT_A $ ag.$1) (getF_A $ ag.$2) (createLink ag)
"Div" -> Divide (getT_A $ ag.$1) (getF_A $ ag.$2) (createLink ag)
"Tf" -> getF_A $ ag.$1
getF_A :: Zipper a -> A
getF_A ag = case (constructor ag) of
"Nest" -> getF_A $ ag.$1
"Neg" -> Minus (Constant 0 Empty) (getF_A $ ag.$1) (createLink ag)
"Const" -> Constant (lexeme_Const ag) (createLink ag)
"Var" -> Variable (lexeme_Var ag) (createLink ag)
putRootA_RootC :: Zipper a -> RootC
putRootA_RootC ag = case (constructor ag) of
"RootA" -> RootC (putLetA_LetC $ ag.$1)
putLetA_LetC :: Zipper a -> LetC
putLetA_LetC ag = case (constructor ag) of
"LetA" -> LetC (putListA_ListC $ ag.$1) (putInA_IntC $ ag.$2)
putInA_IntC :: Zipper a -> InC
putInA_IntC ag = case (constructor ag) of
"InA" -> InC (putA_E $ ag.$1)
putListA_ListC :: Zipper a -> ListC
putListA_ListC ag = case (constructor ag) of
"ConsLetA" -> ConsLetC (lexeme_ConsLetA_1 ag) (putLetA_LetC $ ag.$2) (putListA_ListC $ ag.$3)
"ConsAssignA" -> ConsAssignC (lexeme_ConsAssignA_1 ag) (putA_E $ ag.$2) (putListA_ListC $ ag.$3)
"EmptyListA" -> EmptyListC
putA_E :: Zipper a -> E
putA_E ag = case (getLink ag) of
IsE e -> e
IsT t -> Et $ t
IsF f -> Et $ Tf $ f
Empty -> case (constructor ag) of
"Plus" -> Add (putA_E $ ag.$1) (putA_T $ ag.$2)
"Minus" -> case (getHole ag :: Maybe A) of
Just (Minus (Constant 0 _) _ _) -> Et $ Tf $ Neg (putA_F $ ag.$2)
otherwise -> Sub (putA_E $ ag.$1) (putA_T $ ag.$2)
"Times" -> Et $ Mul (putA_T $ ag.$1) (putA_F $ ag.$2)
"Divide" -> Et $ Div (putA_T $ ag.$1) (putA_F $ ag.$2)
"Constant" -> Et $ Tf $ Const (lexeme_Constant ag)
"Variable" -> Et $ Tf $ Var (lexeme_Variable ag)
putA_T :: Zipper a -> T
putA_T ag = case (getLink ag) of
IsE e -> Tf $ Nest $ e
IsT t -> t
IsF f -> Tf $ f
Empty -> case (constructor ag) of
"Plus" -> Tf $ Nest $ Add (putA_E $ ag.$1) (putA_T $ ag.$2)
"Minus" -> case (getHole ag :: Maybe A) of
Just (Minus (Constant 0 _) _ _) -> Tf $ Neg (putA_F $ ag.$2)
otherwise -> Tf $ Nest $ Sub (putA_E $ ag.$1) (putA_T $ ag.$2)
"Times" -> Mul (putA_T $ ag.$1) (putA_F $ ag.$2)
"Divide" -> Div (putA_T $ ag.$1) (putA_F $ ag.$2)
"Constant" -> Tf $ Const (lexeme_Constant ag)
"Variable" -> Tf $ Var (lexeme_Variable ag)
putA_F :: Zipper a -> F
putA_F ag = case (getLink ag) of
IsE e -> Nest $ e
IsT t -> Nest $ Et $ t
IsF f -> f
Empty -> case (constructor ag) of
"Plus" -> Nest $ Add (putA_E $ ag.$1) (putA_T $ ag.$2)
"Minus" -> case (getHole ag :: Maybe A) of
Just (Minus (Constant 0 _) _ _) -> Neg (putA_F $ ag.$2)
otherwise -> Nest $ Sub (putA_E $ ag.$1) (putA_T $ ag.$2)
"Times" -> Nest $ Et $ Mul (putA_T $ ag.$1) (putA_F $ ag.$2)
"Divide" -> Nest $ Et $ Div (putA_T $ ag.$1) (putA_F $ ag.$2)
"Constant" -> Const (lexeme_Constant ag)
"Variable" -> Var (lexeme_Variable ag)