diff --git a/generics/.classpath b/generics/.classpath
new file mode 100644
index 0000000..f9ed317
--- /dev/null
+++ b/generics/.classpath
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/generics/.project b/generics/.project
new file mode 100644
index 0000000..520a6cf
--- /dev/null
+++ b/generics/.project
@@ -0,0 +1,17 @@
+
+
+ generics
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/generics/.settings/org.eclipse.core.resources.prefs b/generics/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/generics/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/generics/.settings/org.eclipse.jdt.core.prefs b/generics/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9a7984b
--- /dev/null
+++ b/generics/.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/generics/src/generics/Main.java b/generics/src/generics/Main.java
new file mode 100644
index 0000000..84a16a0
--- /dev/null
+++ b/generics/src/generics/Main.java
@@ -0,0 +1,77 @@
+package generics;
+
+import tester.Tester;
+
+class Examples {
+ ILo mint = new Mt();
+ ILo lint = new Cons(1, new Cons(92, new Cons(-12, mint)));
+ ILo lint2 = new Cons(1, new Cons(1, mint));
+
+ ILo mstr = new Mt();
+ ILo hello = new Cons("Hello, ", mstr);
+ ILo world = new Cons("world.", mstr);
+ ILo ajcmsdj = new Cons("ajcmsdj", mstr);
+ ILo helloWorld = new Cons("Hello, ", new Cons("world.", mstr));
+ ILo helloAjcmsdj = new Cons("Hello, ", ajcmsdj);
+
+ boolean testILoAppend(Tester t) {
+ return t.checkExpect(hello.append(world), helloWorld) &&
+ t.checkExpect(lint.append(mint), lint) &&
+ t.checkExpect(mint.append(lint), lint);
+ }
+
+ 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);
+ }
+
+
+}
+
+// Generic function.
+interface IFunc {
+ Y apply(X input);
+}
+
+// Calculate the length of a string.
+class StrLen implements IFunc { 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;
+}}
+
+// Extracts the value of an input.
+interface IEvaluator extends IFunc {}
+
+interface ILo {
+ ILo append(ILo a);
+ A argmax(IEvaluator eval);
+}
+
+class Cons implements ILo {
+ A first;
+ ILo rest;
+
+ Cons(A first, ILo rest) {
+ this.first = first;
+ this.rest = rest;
+ }
+
+ public ILo append(ILo a) { return new Cons(this.first, this.rest.append(a)); }
+
+ public A argmax(IEvaluator eval) {
+ return null;
+ }
+}
+
+class Mt implements ILo {
+ public ILo append(ILo a) { return a; }
+ public A argmax(IEvaluator eval) {
+ throw new UnsupportedOperationException("No max of empty list.");
+ }
+}