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

import edu.neu.ccs.demeterf.FC;
import edu.neu.ccs.demeterf.demfgen.Diff;
import edu.neu.ccs.demeterf.demfgen.classes.*;
import edu.neu.ccs.demeterf.demfgen.StrLTrip.StrPair;
import edu.neu.ccs.demeterf.lib.Cons;
import edu.neu.ccs.demeterf.lib.Empty;
import edu.neu.ccs.demeterf.lib.List;
import edu.neu.ccs.demeterf.lib.ident;
import edu.neu.ccs.demeterf.util.Util;

/**  */
public class Updaters extends Getters{
    public Updaters(List<String> sFs){ super(sFs); }
    public FC functionObj(List<String> superFs){ return new Updaters(superFs); }
    
    public String combine(ClassDef td, DoGen g, final ident n, TypeDefParams ps, Cons<String> sts, final List<StrPair> fs){
        final String type = ""+n+ps;
        return fs.foldl(new List.Fold<StrPair, String>(){
            public String fold(StrPair p, String r){
                String override = superFs.contains(p.b)?Diff.d.override:"";
                return r+("    /** Abstract updater for field "+n+"."+p.b+" */\n"+
                        "    public"+override+" abstract "+type+" "+Diff.capName("update"+Util.capCase(p.b))+"("+p.n+" _"+p.b+");\n");
            }
        }, "");
    }
    public String combine(ClassDef td, DoGen g, final ident n, TypeDefParams ps, Empty<String> sts, final List<StrPair> fs){
        final String type = ""+n+ps;
        return fs.foldl(new List.Fold<StrPair, String>(){
            int i = -1;
            public String fold(StrPair p, String r){
                i++;
                String override = superFs.contains(p.b)?Diff.d.override:"";
                return r+("    /** Updater for field "+n+"."+p.b+" */\n"+
                        "    public"+override+" "+type+" "+Diff.capName("update"+Util.capCase(p.b))+"("+p.n+" _"+p.b+"){\n"+
                        "        return new "+type+"("+
                        fieldNames(fs.replace(i, new StrPair(p.n,"_"+p.b)))+");\n"+
                        "    }\n");
            }
        }, "");
    }
}