nus/cs2030s/labs/Lab6/Lab6.java

163 lines
5.1 KiB
Java

import cs2030s.fp.*;
import java.util.Scanner;
class Lab6 {
public static void main(String[] args) {
// Create a scanner to read from standard input.
Scanner sc = new Scanner(System.in);
// Read a single integer from the test file
// and then run the appropriate test case
switch (sc.nextInt()) {
case 1:
test1();
break;
case 2:
test2();
break;
case 3:
test3();
break;
case 4:
test4();
break;
case 5:
test5();
break;
}
}
public static void test1() {
Lazy<Integer> mod1 = Lazy.from(2030);
System.out.println(mod1.toString());
Lazy<String> mod2 = Lazy.from(() -> "CS2030S");
System.out.println(mod2.toString());
Lazy<String> hello = Lazy.from(() -> {
System.out.println("world!");
return "hello";
});
System.out.println(hello.get().toString());
System.out.println(hello.get().toString());
}
public static void test2() {
Memo<Integer> mod1 = Memo.from(2030);
System.out.println(mod1.toString());
Memo<String> mod2 = Memo.from(() -> "CS2030S");
System.out.println(mod2.toString());
System.out.println(mod2.get());
System.out.println(mod2.toString());
Memo<String> hello = Memo.from(() -> {
System.out.println("world!");
return "hello";
});
System.out.println(hello.get().toString());
System.out.println(hello.get().toString());
}
public static void test3() {
Constant<String> password = () -> "123456";
Lazy<String> lazy = Lazy.from(password);
System.out.println(lazy.toString());
System.out.println(lazy.transform(str -> str.substring(0, 1)).toString());
Memo<String> memo = Memo.from(password);
System.out.println(memo.toString());
System.out.println(memo.transform(str -> str.substring(0, 1)).toString());
System.out.println(memo.transform(str -> str.substring(0, 1)).get().toString());
System.out.println(memo.toString());
Immutator<Integer, String> len = str -> {
System.out.println("length");
return str.length();
};
Lazy<Integer> lazyLen = lazy.transform(len);
System.out.println(lazyLen.toString());
System.out.println(lazyLen.get());
System.out.println(lazyLen.get());
Memo<Integer> step1 = Memo.from(1010);
Memo<Integer> step2 = step1.transform(i -> i * 2);
Memo<Integer> step3 = step2.next(i -> Memo.from(i + 10));
System.out.println(step1.toString());
System.out.println(step2.toString());
System.out.println(step3.toString());
System.out.println(step3.get());
System.out.println(step2.toString());
System.out.println(step1.toString());
Memo<Integer> noErr = Memo.from(0);
Memo<Integer> err = noErr.transform(x -> 1/x);
try {
System.out.println(err.get());
} catch(ArithmeticException ae) {
System.out.println(ae.getMessage());
}
}
public static void test4() {
Combiner<String, Integer, Integer> concat = (x, y) -> {
System.out.println("combine");
return x.toString() + y.toString();
};
Memo<Integer> twenty, thirty, modInt;
twenty = Memo.from(() -> 20);
thirty = Memo.from(() -> 30);
modInt = twenty.combine(thirty, (x, y) -> x * 100 + y);
Memo<String> modStr = twenty.combine(thirty, concat);
System.out.println(twenty.toString());
System.out.println(thirty.toString());
System.out.println(modInt.toString());
System.out.println(modStr.toString());
System.out.println(modStr.get().toString());
System.out.println(twenty.toString());
System.out.println(thirty.toString());
System.out.println(modInt.toString());
Combiner<String, Integer, Double> comb = (x, y) -> x.toString() + " + " + y.toString();
Memo<String> s = modInt.combine(Memo.from(0.1), comb);
System.out.println(s.toString());
System.out.println(s.get());
System.out.println(modInt.toString());
Memo<Integer> x1 = Memo.from(1);
for (int i = 0; i < 10; i ++) {
final Memo<Integer> y1 = x1; // final just to ensure it is unchanged
final int j = i;
x1 = Memo.from(() -> { System.out.println(j); return y1.get() + y1.get(); });
}
System.out.println(x1.get());
}
public static void test5() {
Constant<Boolean> t = new Constant<>() {
public Boolean init() {
return true;
}
};
Constant<Boolean> f = new Constant<>() {
public Boolean init() {
String res = "";
for (int i=0; i<100000; i++) {
res += i;
}
return false;
}
};
Cond cond = new And(new Or(new Bool(t), new Bool(f)), new Not(new Not(new Bool(t))));
System.out.println(cond.toString());
System.out.println(cond.neg().toString());
System.out.println(cond.neg().neg().toString());
System.out.println(cond.eval());
System.out.println(cond.neg().toString());
System.out.println(cond.neg().neg().toString());
}
}