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

import edu.neu.ccs.demeterf.*;
import edu.neu.ccs.demeterf.demfgen.classes.*;
import edu.neu.ccs.demeterf.demfgen.StrLTrip.StrPair;
import edu.neu.ccs.demeterf.lib.List;
import edu.neu.ccs.demeterf.lib.ident;

/**  */
public abstract class Typical extends PCDGPFunc{
    protected final List<String> superFs;
    protected Typical(List<String> sFs){ superFs = sFs; }
    
    public Control control(){ return Control.builtins(TypeDefParams.class,
            ident.class, TypeUse.class, Impl.class, Syntax.class); }
    
    public abstract String combine(ClassDef td, DoGen g, ident n, TypeDefParams ps, List<String> sts, List<StrPair> fs);
    public String combine(IntfcDef td){ return ""; }
    public String fieldArgs(List<StrPair> fs){
        return fs.map(new List.Map<StrPair, String>(){
            public String map(StrPair p){ return p.n+" "+p.b; }
        }).toString(", ", "");
    }
    public String fieldNames(List<StrPair> fs){
        return fs.map(new List.Map<StrPair, String>(){
            public String map(StrPair p){ return p.b; }
        }).toString(", ", "");
    }
    public TypeDefParams combine(EmptyDefParams e){ return e; }
    public <X> List<X> combine(EmptyList e){ return List.create(); }
    public <X> List<X> combine(ConsList c, X f, List<X> r){ return r.push(f); }
    public <X> List<X> combine(ConsList c, Syntax f, List<X> r){ return r; }
    public StrPair combine(Field f, ident n, String type){
        return new StrPair(type, ""+n);
    }
    public String combine(TypeUse tu){ return ""+tu; }
}