// ** This class was generated with DemFGen (vers:01/23/2009)

package gen;

import edu.neu.ccs.demeterf.control.Fields;
import edu.neu.ccs.demeterf.demfgen.lib.ident;
import edu.neu.ccs.demeterf.demfgen.lib.verbatim;
import edu.neu.ccs.demeterf.demfgen.lib.*;
import edu.neu.ccs.demeterf.*;



public class Print extends edu.neu.ccs.demeterf.ID{
   public static String PrintM(Object o){
      return new edu.neu.ccs.demeterf.Traversal(new Print(),edu.neu.ccs.demeterf.Control.builtins()).<Print._LT>traverse(o).toString();
   }

   _LT combine(byte o){ return empty.append(new _S(""+o)); }
   _LT combine(short o){ return empty.append(new _S(""+o)); }
   _LT combine(int o){ return empty.append(new _S(""+o)); }
   _LT combine(long o){ return empty.append(new _S(""+o)); }
   _LT combine(float o){ return empty.append(new _S(""+o)); }
   _LT combine(double o){ return empty.append(new _S(""+o)); }
   _LT combine(char o){ return empty.append(new _S(""+o)); }
   _LT combine(boolean o){ return empty.append(new _S(""+o)); }
   _LT combine(String o){ return empty.append(new _S("\""+o+"\"")); }
   _LT combine(ident o){ return empty.append(new _S(""+o)); }
   _LT combine(verbatim o){ return empty.append(new _S(""+o)); }

   static _LT empty = new _LT();
   public  static class _LT{
     edu.neu.ccs.demeterf.demfgen.lib.List<_T> l;
     public _LT(){ l = new edu.neu.ccs.demeterf.demfgen.lib.Empty<_T>(); }
     public _LT(edu.neu.ccs.demeterf.demfgen.lib.List<_T> ll){ l = ll; }
     public _LT push(_T t){ return new _LT(l.push(t)); }
     public _LT append(_T t){ return new _LT(l.append(t)); }
     public _LT append(_LT t){ return new _LT(l.append(t.l)); }
     public String toString(){ return l.fold(new _F(),""); }
     public _LT compress(){ return l.isEmpty()?this:compress(new _E(), l); }
     public static _LT compress(_S s, edu.neu.ccs.demeterf.demfgen.lib.List<_T> r){
        if(r.isEmpty())return (s.isE())?empty:empty.push(s);
          _T top = r.top();
          if(top.isS())return compress(s.append((_S)top), r.pop());
          if(s.isE())return compress(s, r.pop()).push(top);
          return compress(new _E(), r.pop()).push(top).push(s);
     }
   }
   public static class _T{
     public boolean isS(){ return false; }
     public boolean isE(){ return false; }
   }
   public static class _P extends _T{ public static _P p = new _P(); }
   public static class _M extends _T{ public static _M m = new _M(); }
   public static class _N extends _T{ public static _N n = new _N(); }
   public static class _S extends _T{
     public StringBuffer s;
     public _S(String ss){ s = new StringBuffer(ss); }
     public _S append(_S ss){ s.append(ss.s); return this; }
     public  boolean isS(){ return true; }
   }
   public static class _E extends _S{
     public _E(){ super("");}
     public  boolean isS(){ return true; }
   }
   public static class _F extends edu.neu.ccs.demeterf.demfgen.lib.List.Fold<_T,String>{
     int idt = 0;
     public  String fold(_T t, String s){
        if(t == _P.p)plus();
        else if(t == _M.m)minus();
        else if(t == _N.n)s += "\n"+indent();
        else s += ((_S)t).s;
        return s;
     }
     void plus(){ idt++; }
     void minus(){ idt--; }
     String indent(){ return indent(idt); }
     static String indent(int i){ return (i <= 0)?"":"   "+indent(i-1); }
   }
   _LT combine(Cons _h_, _LT first, _LT rest){
      return empty.append(first).append(rest).compress();
   }
   _LT combine(Empty _h_){
      return empty;
   }
   _LT combine(Start _h_, _LT b){
      return empty.append(b).compress();
   }
   _LT combine(B _h_, _LT xyz){
      return empty.append(xyz).compress();
   }
   _LT combine(Basket _h_){
      return empty.append(new _S("basket")).compress();
   }
   _LT combine(Pencil _h_){
      return empty.append(new _S("p")).append(new _S(" ")).compress();
   }
   _LT combine(Apple _h_){
      return empty.append(new _S("a")).append(new _S(" ")).compress();
   }
   _LT combine(Orange _h_){
      return empty.append(new _S("o")).append(new _S(" ")).compress();
   }
   _LT combine(Z _h_){
      return empty;
   }

}