package edu.neu.ccs.demeterf.examples; /** Functional Transformation Test Class. This includes structural duplication, * Int2Str, and a simple type unifying traversal, ToString. */ // Import the Transformation Package import edu.neu.ccs.demeterf.*; import edu.neu.ccs.demeterf.IDb; import edu.neu.ccs.demeterf.IDf; // Functional Lists in Java abstract class List{} class Empty extends List{} class Cons extends List{ T first; List rest; Cons(T f, List r){ first = f; rest = r; } } // Fold and Map Using Builders abstract class Fold extends IDb{ public abstract R combine(Empty l); public abstract R combine(Cons l, T f, R r); } class Map extends IDb{ public List combine(Empty l){ return new Empty(); } public List combine(Cons l, R f, List r){ return new Cons(f, r); } } // A Few Instances of Fold... class Length extends Fold{ public Integer combine(Empty l){ return 0; } public Integer combine(Cons l, Integer f, Integer r){ return r+1; } } class Sum extends Length{ public Integer combine(Cons l, Integer f, Integer r){ return f+r; } } // A Few Functions for Transformations class Add1 extends IDf{ public Integer apply(Integer i){ return i+1; } } class Int2Str extends IDf{ public String apply(Integer i){ return "'"+i+"'"; } } // ToString Builder (Builds a String) class ToString extends Fold{ public String combine(Empty l){ return "()"; } public String combine(Cons l, Object first, String r){ return "("+first+" "+r+")"; } } // Test Class public class FuncTest{ private FuncTest(){} static void print(String s){ System.out.println(s); } public static void main(String[] args){ List lst = fromArray(new Integer[]{1,5,2,6,3,4,7}); Traversal str = new Traversal(new ToString()), len = new Traversal(new Length()), sum = new Traversal(new Sum()), add = new Traversal(new Add1()), i2s = new Traversal(new Int2Str()); print(" String: "+str.traverse(lst)); print(" Length: "+len.traverse(lst)); print(" Sum: "+sum.traverse(lst)); print(" Add1: "+str.traverse(add.>traverse(lst))); print(" I2S: "+str.traverse(i2s.>traverse(lst))); } // Create a List from an Array static List fromArray(S a[]){ return fromArray(a,0); } static List fromArray(S a[], int i){ if(i == a.length) return new Empty(); return new Cons(a[i], fromArray(a,i+1)); } }