import cs2030s.fp.Immutator; import cs2030s.fp.Combiner; import cs2030s.fp.Memo; public class Test5 { public static void main(String[] args) { CS2030STest we = new CS2030STest(); class A { private int x; public A(int x) { this.x = x; } public int getX() { return this.x; } @Override public String toString() { return "A:" + this.x; } } class B extends A { public B(int x) { super(x); } @Override public String toString() { return "B:" + super.toString(); } } class C extends B { public C(int x) { super(x); } @Override public String toString() { return "C:" + super.toString(); } } Immutator incr = x -> new C(x.getX() + 1); Combiner fib = (x, y) -> new C(x.getX() + y.getX()); Immutator, A> dbl = x -> MemoList.generate(x.getX(), new C(x.getX()), y -> new C(y.getX() + 1)); MemoList bList1 = MemoList.generate(8, new C(0), incr); we.expect( "PECS is followed on generate (Immutator)", bList1.toString(), "[C:B:A:0, ?, ?, ?, ?, ?, ?, ?]" ); MemoList bList2 = MemoList.generate(8, new C(0), new C(1), fib); we.expect( "PECS is followed on generate (Combiner)", bList2.toString(), "[C:B:A:0, C:B:A:1, ?, ?, ?, ?, ?, ?]" ); MemoList bList3 = bList1.map(incr); we.expect( "PECS is followed on map", bList3.toString(), "[?, ?, ?, ?, ?, ?, ?, ?]" ); MemoList bList4 = bList1.flatMap(dbl); we.expect( "PECS is followed on flatMap", bList4.toString(), "[C:B:A:1, C:B:A:2, ?, C:B:A:3, ?, ?, C:B:A:4, ?, ?, ?, C:B:A:5, ?, ?, ?, ?, C:B:A:6, ?, ?, ?, ?, ?, C:B:A:7, ?, ?, ?, ?, ?, ?]" ); } }