package edu.neu.ccs.demeterf.examples;
import edu.neu.ccs.demeterf.*;
import java.util.Arrays;

/**  Test of Array support.  Arrays are handled similar to map; each index is
 *     recursively traversed, and the results are combined into an array, whose
 *     runtime type is the nearest bound (possibly Object) for all the new
 *     elements.  Below we produce an Array of Strings from the two different
 *     Arrays (R[] and T[]). */
public class ArrayTest {
    static void p(String s){ System.out.println(s); }
    public static void main(String args[]){
        R r = new R();
        Q q = new Q(new S(), new R[]{r,r,r,r});
        
        Traversal t = new Traversal(new ID(){
            String combine(S s){ return "S"; }
            String combine(R s){ return "R"; }
            String combine(Q q, String s, String[] rs){
                return "Q("+s+", "+Arrays.toString(rs)+")";    
            }});
        
        // Prints " Returned: Q(S, [R, R, R, R])"
        p(" Returned: "+t.traverse(q));

        // Prints " Map: [R, S, R, S]"
        p(" Map: "+Arrays.toString(t.<String[]>traverse(new T[]{r, new S(),
                                                                r, new S()})));
    }
    
    static class Q{
        S s; R r[];
        Q(S ss, R rr[]){ s = ss; r = rr; }
    }
    static class T{}
    static class R extends T{}
    static class S extends T{}
}