diff --git a/abstraction/.classpath b/abstraction/.classpath
new file mode 100644
index 0000000..f9ed317
--- /dev/null
+++ b/abstraction/.classpath
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/abstraction/.project b/abstraction/.project
new file mode 100644
index 0000000..cdac6fb
--- /dev/null
+++ b/abstraction/.project
@@ -0,0 +1,17 @@
+
+
+ abstraction
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/abstraction/.settings/org.eclipse.core.resources.prefs b/abstraction/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/abstraction/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/abstraction/.settings/org.eclipse.jdt.core.prefs b/abstraction/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9a7984b
--- /dev/null
+++ b/abstraction/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=21
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=21
diff --git a/abstraction/src/abstraction/Main.java b/abstraction/src/abstraction/Main.java
new file mode 100644
index 0000000..7a9e0d9
--- /dev/null
+++ b/abstraction/src/abstraction/Main.java
@@ -0,0 +1,93 @@
+package abstraction;
+
+import tester.Tester;
+
+class Examples {
+ ILoStrings someWords = new ConsString("feldspar", new ConsString("assignment", new ConsString("curb", new LastString("carpet"))));
+
+ boolean tests(Tester t) {
+ return t.checkExpect(someWords.earliest(new OrderByShortness()), "curb")
+ && t.checkExpect(someWords.earliest(new OrderByAlpha()), "assignment")
+ && t.checkExpect(someWords.earliest(new OrderByOrder()), "feldspar")
+ && t.checkExpect(someWords.earliest(new OrderByLongness()), "assignment")
+ && t.checkExpect(someWords.earliest(new OrderByUnalpha()), "feldspar")
+ && t.checkExpect(someWords.earliest(new OrderByDisorder()), "carpet");
+ }
+}
+
+interface IStringsBefore {
+ boolean before(String s1, String s2);
+}
+
+// Negates an ordering.
+class Disorder {
+ IStringsBefore ordering;
+
+ Disorder(IStringsBefore ordering) { this.ordering = ordering; }
+
+ boolean after(String s1, String s2) {
+ return ! this.ordering.before(s1, s2);
+ }
+}
+
+class OrderByShortness implements IStringsBefore { public boolean before(String s1, String s2) {
+ return s1.length() <= s2.length();
+}}
+
+class OrderByAlpha implements IStringsBefore { public boolean before(String s1, String s2) {
+ return s1.compareTo(s2) <= 0;
+}}
+
+class OrderByOrder implements IStringsBefore { public boolean before(String s1, String s2) {
+ return true;
+}}
+
+class OrderByLongness implements IStringsBefore { public boolean before(String s1, String s2) {
+ return new Disorder(new OrderByShortness()).after(s1, s2);
+}}
+
+class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
+ return new Disorder(new OrderByAlpha()).after(s1, s2);
+}}
+
+class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
+ return new Disorder(new OrderByOrder()).after(s1, s2);
+}}
+
+// A non-empty list of strings.
+interface ILoStrings {
+ String val(); // Gets the value.
+ String earliest(IStringsBefore ordering); // Gets the earliest in a list of strings.
+ String earliestHelper(IStringsBefore ordering, String prev);
+}
+
+abstract class ALoStrings implements ILoStrings {
+ String val;
+
+ ALoStrings(String val) { this.val = val; }
+
+ public String val() { return this.val; }
+}
+
+class ConsString extends ALoStrings {
+ ILoStrings nxt;
+
+ ConsString(String val, ILoStrings nxt) {
+ super(val);
+ this.nxt = nxt;
+ }
+
+ public String earliest(IStringsBefore ordering) {
+ return ordering.before(this.val, this.nxt.val()) ? this.nxt.earliestHelper(ordering, this.val) : this.nxt.earliest(ordering);
+ }
+
+ public String earliestHelper(IStringsBefore ordering, String prev) {
+ return new ConsString(prev, this.nxt).earliest(ordering);
+ }
+}
+
+class LastString extends ALoStrings {
+ LastString(String val) { super(val); }
+ public String earliest(IStringsBefore ordering) { return this.val; }
+ public String earliestHelper(IStringsBefore ordering, String prev) { return prev; }
+}
\ No newline at end of file
diff --git a/generics/src/generics/Main.java b/generics/src/generics/Main.java
index 84a16a0..87012ff 100644
--- a/generics/src/generics/Main.java
+++ b/generics/src/generics/Main.java
@@ -21,10 +21,10 @@ class Examples {
}
boolean testILoArmax(Tester t) {
- return t.checkExpect(helloWorld.argmax(new IEvaluator()), "Hello, ")
- && t.checkExpect(helloAjcmsdj.argmax(new IEvaluator()), "Hello, ")
- && t.checkExpect(lint2.argmax(new IEvaluator()), 1)
- && t.checkExpect(lint.argmax(new IEvaluator()), 92);
+ return t.checkExpect(helloWorld.argmax(new StrLen()), "Hello, ")
+ && t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
+ && t.checkExpect(lint2.argmax(new IntSize()), 1)
+ && t.checkExpect(lint.argmax(new IntSize()), 92);
}
@@ -35,22 +35,25 @@ interface IFunc {
Y apply(X input);
}
+// Extracts the value of an input.
+interface IEvaluator extends IFunc {}
+
// Calculate the length of a string.
-class StrLen implements IFunc { public Integer apply(String input) {
+class StrLen implements IEvaluator { public Integer apply(String input) {
return input.length();
}}
// Calculate the size of an integer.
-class IntSize implements IFunc { public Integer apply(Integer input) {
- return input - 14;
+class IntSize implements IEvaluator { public Integer apply(Integer input) {
+ return input;
}}
-// Extracts the value of an input.
-interface IEvaluator extends IFunc {}
-
+// A list of A.
interface ILo {
ILo append(ILo a);
A argmax(IEvaluator eval);
+ A argmaxHelper(IEvaluator eval, A prev, Integer prevVal);
+ ILo skip();
}
class Cons implements ILo {
@@ -64,8 +67,21 @@ class Cons implements ILo {
public ILo append(ILo a) { return new Cons(this.first, this.rest.append(a)); }
- public A argmax(IEvaluator eval) {
- return null;
+ public A argmax(IEvaluator eval) {
+ return argmaxHelper(eval, this.first, eval.apply(this.first));
+ }
+
+ public A argmaxHelper(IEvaluator eval, A prev, Integer prevVal) {
+ A now = this.first;
+ Integer nowVal = eval.apply(now);
+
+ return prevVal >= nowVal ?
+ this.rest.argmaxHelper(eval, prev, prevVal) :
+ this.rest.skip().argmaxHelper(eval, now, nowVal);
+ };
+
+ public ILo skip() {
+ return this.rest;
}
}
@@ -74,4 +90,10 @@ class Mt implements ILo {
public A argmax(IEvaluator eval) {
throw new UnsupportedOperationException("No max of empty list.");
}
-}
+
+ public A argmaxHelper(IEvaluator eval, A prev, Integer prevVal) {
+ return prev;
+ }
+
+ public ILo skip() { return this; }
+}
\ No newline at end of file