// ** Batch Generated with DemeterF

// ** This file was generated with DemFGen (vers:05/23/2010)

package edu.neu.ccs.demeterf.demfgen.traversals;

import edu.neu.ccs.demeterf.lib.*;
import edu.neu.ccs.demeterf.lib.*;
import edu.neu.ccs.demeterf.demfgen.*;
import edu.neu.ccs.demeterf.demfgen.dgp.DGPFunc;
import edu.neu.ccs.demeterf.demfgen.traversals.Travs;
import edu.neu.ccs.demeterf.demfgen.pcdgp.PCDGPFunc;
import edu.neu.ccs.demeterf.dispatch.*;
import edu.neu.ccs.demeterf.*;
import edu.neu.ccs.demeterf.demfgen.ClassHier.InhrtPair;
import edu.neu.ccs.demeterf.demfgen.DemFGenMain;
import java.io.*;
import java.io.FileInputStream;
import edu.neu.ccs.demeterf.util.Util;
import edu.neu.ccs.demeterf.util.CLI;
import edu.neu.ccs.demeterf.demfgen.classes.Package;
import edu.neu.ccs.demeterf.demfgen.DemFGenMain;
import edu.neu.ccs.demeterf.demfgen.classes.*;

public class ParseGenTrav {
   private ParseGen.CombStr func;
   public ParseGenTrav(ParseGen.CombStr f){ func = f; }

   public String traverse(final List<TypeDef> _h, final DoGen _targ_){ return traverseList_TypeDef_(_h, _targ_); }

   public String traverseList_TypeDef_(final List<TypeDef> _h, final DoGen _targ_){
        if(_h instanceof Cons) return traverseCons_TypeDef_((Cons<TypeDef>)_h, _targ_);
        if(_h instanceof Empty) return traverseEmpty_TypeDef_((Empty<TypeDef>)_h, _targ_);
        else throw new RuntimeException("Unknown List Variant");
   }
   public String traverseEmpty_TypeDef_(final Empty<TypeDef> _h, final DoGen _targ_){
        return func.combine((List<?>)_h);
   }
   public String traverseCons_TypeDef_(final Cons<TypeDef> _h, final DoGen _targ_){
        String _first = func.combine(_h.getFirst());
        String _rest = traverseList_TypeDef_(_h.getRest(), _targ_);
        if((_h instanceof Cons)){

            if((_first instanceof String)){

                if((_rest instanceof String)){
                    return func.combine((Cons<?>)_h,(String)_first, (String)_rest);
                }else{
                    return func.combine((List<?>)_h);
                }
            }else{
                return func.combine((List<?>)_h);
            }
        }else{
            return func.combine((List<?>)_h);
        }
   }

}