The.
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,3 +13,4 @@ replay_pid*
|
|||||||
**/bin/
|
**/bin/
|
||||||
.old/
|
.old/
|
||||||
.metadata/
|
.metadata/
|
||||||
|
**/.classpath
|
||||||
|
Binary file not shown.
@@ -1,5 +0,0 @@
|
|||||||
package abstraction;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,162 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
boole
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,146 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=21
|
|
||||||
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
|
|
@@ -1,180 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh)
|
|
||||||
|
|
||||||
&& t.checkExpect(hh.sort(new Comp(new StrLen())), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare the sizes of two things with the given Evaluator.
|
|
||||||
class Comp<A> implements IComparator<A> {
|
|
||||||
IEvaluator<A> eval;
|
|
||||||
Comp(IEvaluator<A> eval) {
|
|
||||||
this.eval = eval;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int compare(A a1, A a2) {
|
|
||||||
return eval.apply(a1) - eval.apply(a2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,163 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
boole
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,5 +0,0 @@
|
|||||||
package abstraction;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
|
|
||||||
}
|
|
@@ -1,149 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, new Cons<A>(this.first, this.rest));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,155 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,131 +0,0 @@
|
|||||||
package fibonacci;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
|
|
||||||
ISequence<Integer> f;
|
|
||||||
ISequence<String> a;
|
|
||||||
ISeqGen<String> aGen = new AGen();
|
|
||||||
|
|
||||||
void init() {
|
|
||||||
this.f = new Fibonacci();
|
|
||||||
this.a = new GenSeq<String>("", aGen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testFibonacci(Tester t) {
|
|
||||||
init();
|
|
||||||
t.checkExpect(f.get(), 0);
|
|
||||||
t.checkExpect(f.get(), 1);
|
|
||||||
t.checkExpect(f.get(), 1);
|
|
||||||
t.checkExpect(f.get(), 2);
|
|
||||||
t.checkExpect(f.get(), 3);
|
|
||||||
t.checkExpect(f.get(), 5);
|
|
||||||
t.checkExpect(f.get(), 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testASeq(Tester t) {
|
|
||||||
init();
|
|
||||||
t.checkExpect(a.get(), "");
|
|
||||||
t.checkExpect(a.get(), "a");
|
|
||||||
t.checkExpect(a.get(), "aa");
|
|
||||||
t.checkExpect(a.get(), "aaa");
|
|
||||||
t.checkExpect(a.get(), "aaaa");
|
|
||||||
t.checkExpect(a.get(), "aaaaa");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A generic list.
|
|
||||||
interface ILo<A> {}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {}
|
|
||||||
|
|
||||||
interface ISequence<X> {
|
|
||||||
// Returns the current element in the sequence.
|
|
||||||
// EFFECT: Updates the state to the next element in the sequence.
|
|
||||||
X get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sequence generator method.
|
|
||||||
interface ISeqGen<X> {
|
|
||||||
X gen(X state); // Generates the next value in the sequence given the current state.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Fibonacci sequence.
|
|
||||||
class Fibonacci implements ISequence<Integer> {
|
|
||||||
|
|
||||||
int idx; // Number of times `get()` has been called.
|
|
||||||
int pre; // The previous (last) number.
|
|
||||||
int pen; // The penultimate (second to last) number.
|
|
||||||
|
|
||||||
Fibonacci() {
|
|
||||||
this.pen = 0;
|
|
||||||
this.pre = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the next in the sequence.
|
|
||||||
public Integer get() {
|
|
||||||
int ret; // What to return.
|
|
||||||
/*
|
|
||||||
|
|
||||||
idx pen pre ret
|
|
||||||
0 0 1 0
|
|
||||||
1 0 1 1
|
|
||||||
2 1 1 2
|
|
||||||
3 1 2 3
|
|
||||||
4 2 3 5
|
|
||||||
5 3 5 8
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
// F(0) = 0; F(1) = 1
|
|
||||||
if (this.idx <= 1) ret = this.idx;
|
|
||||||
else { // F(n) = F(n-1) + F(n-2)
|
|
||||||
ret = this.pre + this.pen;
|
|
||||||
|
|
||||||
this.pen = this.pre;
|
|
||||||
this.pre = ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.idx = this.idx + 1;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A generic sequence.
|
|
||||||
class GenSeq<X> implements ISequence<X> {
|
|
||||||
|
|
||||||
X state; // The current state of the sequence.
|
|
||||||
ISeqGen<X> seqGen; // The method by which new values are generated.
|
|
||||||
|
|
||||||
// Create new generic sequence given an initial state.
|
|
||||||
GenSeq(X init, ISeqGen<X> seqGen) {
|
|
||||||
this.state = init;
|
|
||||||
this.seqGen = seqGen;
|
|
||||||
}
|
|
||||||
|
|
||||||
public X get() {
|
|
||||||
X ret = this.state;
|
|
||||||
this.state = this.seqGen.gen(this.state);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A string of n "a"s.
|
|
||||||
class AGen implements ISeqGen<String> {
|
|
||||||
|
|
||||||
public String gen(String state) {
|
|
||||||
return state.concat("a");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,153 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen(), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,149 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) == 0) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,155 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new hh.CompStr()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,153 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen(), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,94 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(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 StringsAfter(new OrderByShortness()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return new StringsAfter(new OrderByAlpha()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(s1, s2);
|
|
||||||
return new StringsAfter(new OrderByAlpha()).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; }
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,94 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(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 StringsAfter(new OrderByShortness()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
return new StringsAfter(new OrderByAlpha()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,154 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,155 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,176 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare the sizes of two things with the given Evaluator.
|
|
||||||
class Comp<A> implements IComparator<A> {
|
|
||||||
IEvaluator eval;
|
|
||||||
Comp(IEvaluator eval) {
|
|
||||||
this.eval = eval;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int compare()
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,153 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,155 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,94 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 StringsAfter(new OrderByShortness()).apply(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
return new StringsAfter(new OrderByAlpha()).apply(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=21
|
|
||||||
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
|
|
@@ -1,155 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,89 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
}
|
|
||||||
|
|
||||||
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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) > 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,156 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
ILo<A> newsort = sorted.insertSorted(comp, this.first);
|
|
||||||
return this.rest.sortHelper(comp, newsort);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 StringsAfter(new OrderByAlpha()).apply(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,153 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 OrderByAlpha()).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; }
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 OrderByOrderkt hi ()).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; }
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) <= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,180 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh)
|
|
||||||
|
|
||||||
&& t.checkExpect(hh.sort(new Comp<String>(new StrLen())), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare the sizes of two things with the given Evaluator.
|
|
||||||
class Comp<A> implements IComparator<A> {
|
|
||||||
IEvaluator<A> eval;
|
|
||||||
Comp(IEvaluator<A> eval) {
|
|
||||||
this.eval = eval;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int compare(A a1, A a2) {
|
|
||||||
return eval.apply(a1) - eval.apply(a2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,153 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) <= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,84 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
||||||
|
|
||||||
Main.java
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) == 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,178 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare the sizes of two things with the given Evaluator.
|
|
||||||
class Comp<A> implements IComparator<A> {
|
|
||||||
IEvaluator<A> eval;
|
|
||||||
Comp(IEvaluator<A> eval) {
|
|
||||||
this.eval = eval;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int compare(A a1, A a2) {
|
|
||||||
return eval.apply(a1) - eval.apply(a2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,832 +0,0 @@
|
|||||||
package mastermind;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Image;
|
|
||||||
import java.util.Random;
|
|
||||||
import javalib.funworld.*;
|
|
||||||
import javalib.worldcanvas.*;
|
|
||||||
import javalib.worldimages.*;
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
|
|
||||||
ILoInt noInt = new MtInt();
|
|
||||||
ILoInt intsOne = new ConsInt(1, new ConsInt(2, new ConsInt(3, noInt)));
|
|
||||||
|
|
||||||
Dot redDot = new Dot(Color.red), greenDot = new Dot(Color.green), blueDot =
|
|
||||||
new Dot(Color.blue), reenDot = new Dot(new Color(255, 255, 0));
|
|
||||||
|
|
||||||
ILoDot noDot = new MtDot(), dotsOne = new ConsDot(
|
|
||||||
redDot,
|
|
||||||
new ConsDot(greenDot, new ConsDot(blueDot, noDot)),
|
|
||||||
new Random(0)
|
|
||||||
), dotsTwo = new ConsDot(
|
|
||||||
redDot,
|
|
||||||
new ConsDot(blueDot, new ConsDot(blueDot, noDot))
|
|
||||||
), dotsThree = new ConsDot(
|
|
||||||
reenDot,
|
|
||||||
new ConsDot(reenDot, new ConsDot(reenDot, noDot))
|
|
||||||
), exampleDotsOne = new ConsDot(
|
|
||||||
redDot,
|
|
||||||
new ConsDot(
|
|
||||||
greenDot,
|
|
||||||
new ConsDot(
|
|
||||||
blueDot,
|
|
||||||
new ConsDot(
|
|
||||||
greenDot,
|
|
||||||
new ConsDot(redDot, new ConsDot(greenDot, noDot))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
), exampleDotsTwo = new ConsDot(
|
|
||||||
redDot,
|
|
||||||
new ConsDot(
|
|
||||||
blueDot,
|
|
||||||
new ConsDot(
|
|
||||||
greenDot,
|
|
||||||
new ConsDot(
|
|
||||||
greenDot,
|
|
||||||
new ConsDot(blueDot, new ConsDot(blueDot, noDot))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
), exampleDotsOneNoExact = new ConsDot(
|
|
||||||
greenDot,
|
|
||||||
new ConsDot(blueDot, new ConsDot(redDot, new ConsDot(greenDot, noDot)))
|
|
||||||
), exampleDotsTwoNoExact = new ConsDot(
|
|
||||||
blueDot,
|
|
||||||
new ConsDot(greenDot, new ConsDot(blueDot, new ConsDot(blueDot, noDot)))
|
|
||||||
);
|
|
||||||
|
|
||||||
Feedback exampleFeedback = new Feedback(2, 2);
|
|
||||||
|
|
||||||
Game exampleGame = new Game();
|
|
||||||
|
|
||||||
boolean testILoDotLen(Tester t) {
|
|
||||||
return t.checkExpect(noDot.len(), 0) && t.checkExpect(dotsOne.len(), 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotGetnth(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException("Index out of bounds."),
|
|
||||||
noDot,
|
|
||||||
"get",
|
|
||||||
1
|
|
||||||
) &&
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException("Index out of bounds."),
|
|
||||||
dotsOne,
|
|
||||||
"get",
|
|
||||||
3
|
|
||||||
) &&
|
|
||||||
t.checkExpect(dotsOne.get(0), redDot) &&
|
|
||||||
t.checkExpect(dotsOne.get(2), blueDot)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotGen(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkExpect(noDot.gen(219), noDot) &&
|
|
||||||
t.checkExpect(dotsOne.gen(1), new ConsDot(redDot, noDot)) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsOne.gen(3),
|
|
||||||
new ConsDot(
|
|
||||||
greenDot,
|
|
||||||
new ConsDot(greenDot, new ConsDot(blueDot, noDot))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotIn(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkExpect(dotsOne.in(blueDot), true) &&
|
|
||||||
t.checkExpect(noDot.in(redDot), false) &&
|
|
||||||
t.checkExpect(dotsThree.in(blueDot), false)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoIntRemove(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkExpect(
|
|
||||||
intsOne.remove(0),
|
|
||||||
new ConsInt(2, new ConsInt(3, noInt))
|
|
||||||
) &&
|
|
||||||
t.checkExpect(
|
|
||||||
intsOne.remove(2),
|
|
||||||
new ConsInt(1, new ConsInt(2, noInt))
|
|
||||||
) &&
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException(
|
|
||||||
"Index out of bounds: cannot remove something from nothing."
|
|
||||||
),
|
|
||||||
intsOne,
|
|
||||||
"remove",
|
|
||||||
3
|
|
||||||
) &&
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException(
|
|
||||||
"Index out of bounds: cannot remove something from nothing."
|
|
||||||
),
|
|
||||||
noInt,
|
|
||||||
"remove",
|
|
||||||
0
|
|
||||||
) &&
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException("Indices must be positive."),
|
|
||||||
intsOne,
|
|
||||||
"remove",
|
|
||||||
-2
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoIntLen(Tester t) {
|
|
||||||
return t.checkExpect(intsOne.len(), 3) && t.checkExpect(noInt.len(), 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoIntSubOne(Tester t) {
|
|
||||||
return t.checkExpect(
|
|
||||||
intsOne.subOne(),
|
|
||||||
new ConsInt(0, new ConsInt(1, new ConsInt(2, noInt)))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotExactIndices(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException(
|
|
||||||
"Empty list doesn't exactly match anything."
|
|
||||||
),
|
|
||||||
noDot,
|
|
||||||
"exactIndices",
|
|
||||||
noDot
|
|
||||||
) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsOne.exactIndices(dotsOne),
|
|
||||||
new ConsInt(0, new ConsInt(1, new ConsInt(2, noInt)))
|
|
||||||
) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsOne.exactIndices(dotsTwo),
|
|
||||||
new ConsInt(0, new ConsInt(2, new MtInt()))
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotRemove(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkException(
|
|
||||||
new IllegalArgumentException("Index out of bounds."),
|
|
||||||
noDot,
|
|
||||||
"remove",
|
|
||||||
0
|
|
||||||
) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsOne.remove(0),
|
|
||||||
new ConsDot(greenDot, new ConsDot(blueDot, noDot))
|
|
||||||
) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsTwo.remove(1),
|
|
||||||
new ConsDot(redDot, new ConsDot(blueDot, noDot))
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotRemoveAll(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkExpect(dotsOne.removeAll(noInt), dotsOne) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsOne.removeAll(
|
|
||||||
new ConsInt(0, new ConsInt(1, new ConsInt(2, noInt)))
|
|
||||||
),
|
|
||||||
noDot
|
|
||||||
) &&
|
|
||||||
t.checkExpect(noDot.removeAll(intsOne), noDot) &&
|
|
||||||
t.checkExpect(
|
|
||||||
dotsTwo.removeAll(new ConsInt(1, new ConsInt(2, noInt))),
|
|
||||||
new ConsDot(redDot, noDot)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotCountInexact(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkExpect(noDot.countInexact(noDot), 0) &&
|
|
||||||
t.checkExpect(dotsOne.countInexact(dotsOne), 3) &&
|
|
||||||
t.checkExpect(
|
|
||||||
exampleDotsOneNoExact.countInexact(exampleDotsTwoNoExact),
|
|
||||||
2
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoDotCompare(Tester t) {
|
|
||||||
return (
|
|
||||||
t.checkExpect(
|
|
||||||
exampleDotsOne.compare(exampleDotsTwo),
|
|
||||||
exampleFeedback
|
|
||||||
) &&
|
|
||||||
t.checkExpect(dotsOne.compare(dotsOne), new Feedback(3, 0))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testDrawMethods(Tester t) {
|
|
||||||
// WorldImage incomplete = new IncompleteGuess(exampleDotsOne).draw();
|
|
||||||
//WorldImage guesses = new ConsGuess(new Guess(dotsOne, new Feedback(1, 2)), new ConsGuess(new Guess(dotsTwo, new Feedback(2, 5)), new MtGuess())).draw();
|
|
||||||
Game game = new Game().addGuess(new Guess(dotsOne, exampleFeedback));
|
|
||||||
|
|
||||||
WorldImage gameImg = game.draw();
|
|
||||||
|
|
||||||
int w = (int) gameImg.getWidth();
|
|
||||||
int h = (int) gameImg.getHeight();
|
|
||||||
|
|
||||||
WorldCanvas c = new WorldCanvas(w, h);
|
|
||||||
WorldScene s = new WorldScene(w, h);
|
|
||||||
|
|
||||||
return game.launch();
|
|
||||||
//c.drawScene(s.placeImageXY(gameImg, w/2, h/2))
|
|
||||||
//c.drawScene(s.placeImageXY(incomplete, (int) (incomplete.getWidth()/2), 100))
|
|
||||||
//c.drawScene(s.placeImageXY(exampleFeedback.draw(), 100, 100))
|
|
||||||
//c.drawScene(s.placeImageXY(redDot.draw(), 100, 100))
|
|
||||||
//c.drawScene(s.placeImageXY(dotsOne.draw(), 250, 250))
|
|
||||||
//&& c.show();
|
|
||||||
//true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Util {
|
|
||||||
|
|
||||||
static int scale = 2;
|
|
||||||
static int fontSz = 24 * scale;
|
|
||||||
static int gapW = 4 * scale; // The gap between objects.
|
|
||||||
|
|
||||||
// Drawing methods.
|
|
||||||
static WorldImage gap = new RectangleImage(
|
|
||||||
gapW,
|
|
||||||
gapW,
|
|
||||||
"outline",
|
|
||||||
new Color(0, 0, 0, 0)
|
|
||||||
);
|
|
||||||
|
|
||||||
static WorldImage pairGap(WorldImage img1, WorldImage img2) {
|
|
||||||
return new BesideAlignImage(AlignModeY.MIDDLE, img1, gap, img2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static WorldImage pairGapAbove(WorldImage img1, WorldImage img2) {
|
|
||||||
return new AboveAlignImage(AlignModeX.CENTER, img1, gap, img2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static WorldImage strPair(String str1, String str2) {
|
|
||||||
return pairGap(
|
|
||||||
new TextImage(str1, fontSz, Color.black),
|
|
||||||
new TextImage(str2, fontSz, Color.black)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int pairgapW = 2 * 16 * scale + gapW;
|
|
||||||
}
|
|
||||||
|
|
||||||
// A game state.
|
|
||||||
class Game extends World {
|
|
||||||
|
|
||||||
static ILoDot DEFAULTDOTS = new ConsDot(
|
|
||||||
new Dot(Color.RED),
|
|
||||||
new ConsDot(
|
|
||||||
new Dot(Color.GREEN),
|
|
||||||
new ConsDot(new Dot(Color.BLUE), new MtDot())
|
|
||||||
)
|
|
||||||
);
|
|
||||||
static GameConf DEFAULTCONF = new GameConf(true, 5, 5, DEFAULTDOTS);
|
|
||||||
|
|
||||||
GameConf conf; // The game's configuration.
|
|
||||||
ILoDot solution; // The solution to the game.
|
|
||||||
int guessesLeft; // The number of guesses the player has left.
|
|
||||||
ILoGuess guesses; // The guesses the player has taken.
|
|
||||||
boolean done; // Is the game over?
|
|
||||||
boolean won; // Did they player win?
|
|
||||||
|
|
||||||
Game(
|
|
||||||
GameConf conf,
|
|
||||||
ILoDot solution,
|
|
||||||
int guessesLeft,
|
|
||||||
ILoGuess guesses,
|
|
||||||
boolean won,
|
|
||||||
boolean done
|
|
||||||
) {
|
|
||||||
if (this.won && !this.done) throw new IllegalArgumentException(
|
|
||||||
"Can't win before you've finished playing."
|
|
||||||
);
|
|
||||||
this.conf = conf;
|
|
||||||
this.solution = solution;
|
|
||||||
this.won = won;
|
|
||||||
this.done = done;
|
|
||||||
this.guessesLeft = guessesLeft;
|
|
||||||
this.guesses = guesses;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convenience constructor using default config and starting values.
|
|
||||||
Game() {
|
|
||||||
this(
|
|
||||||
DEFAULTCONF,
|
|
||||||
DEFAULTCONF.options.gen(DEFAULTCONF.len),
|
|
||||||
DEFAULTCONF.nguesses,
|
|
||||||
new MtGuess(),
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldScene makeScene() {
|
|
||||||
WorldScene bg = this.getEmptyScene();
|
|
||||||
WorldImage dot = new Dot(Color.RED).draw();
|
|
||||||
return bg.placeImageXY(
|
|
||||||
dot,
|
|
||||||
(int) dot.getWidth(),
|
|
||||||
(int) dot.getHeight()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean launch() {
|
|
||||||
return this.bigBang(100, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the current game state.
|
|
||||||
WorldImage draw() {
|
|
||||||
return new AboveAlignImage(
|
|
||||||
AlignModeX.LEFT,
|
|
||||||
this.draw_sol(),
|
|
||||||
this.draw_guesses(),
|
|
||||||
this.draw_options()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the solution.
|
|
||||||
WorldImage draw_sol() {
|
|
||||||
if (this.done) return this.draw_sol_rev();
|
|
||||||
else return this.draw_sol_hid();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the revealed answer.
|
|
||||||
WorldImage draw_sol_rev() {
|
|
||||||
return this.solution.draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the hidden answer.
|
|
||||||
WorldImage draw_sol_hid() {
|
|
||||||
return new RectangleImage(
|
|
||||||
this.solution.getW(),
|
|
||||||
2 * Dot.r,
|
|
||||||
OutlineMode.SOLID,
|
|
||||||
Color.BLACK
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldImage draw_guesses() {
|
|
||||||
return this.guesses.draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldImage draw_options() {
|
|
||||||
return this.conf.options.draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convenience methods for testing -- not part of program.
|
|
||||||
Game win() {
|
|
||||||
return new Game(
|
|
||||||
this.conf,
|
|
||||||
this.solution,
|
|
||||||
this.guessesLeft,
|
|
||||||
this.guesses,
|
|
||||||
true,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Game addGuess(Guess guess) {
|
|
||||||
return new Game(
|
|
||||||
this.conf,
|
|
||||||
this.solution,
|
|
||||||
this.guessesLeft,
|
|
||||||
new ConsGuess(guess, this.guesses),
|
|
||||||
this.won,
|
|
||||||
this.done
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A game configuration.
|
|
||||||
class GameConf {
|
|
||||||
|
|
||||||
boolean dups; // Whether duplicates are allowed.
|
|
||||||
int len; // The length of the sequence to be guessed.
|
|
||||||
int nguesses; // Number of guesses the player is allowed.
|
|
||||||
ILoDot options; // The dots of which the solution is comprised.
|
|
||||||
|
|
||||||
GameConf(boolean dups, int len, int nguesses, ILoDot options) {
|
|
||||||
if (len <= 0) throw new IllegalArgumentException(
|
|
||||||
"Length of the solution must be greater than 0."
|
|
||||||
);
|
|
||||||
if (nguesses <= 0) throw new IllegalArgumentException(
|
|
||||||
"Must provide the player some guesses."
|
|
||||||
);
|
|
||||||
int oplen = options.len();
|
|
||||||
if (oplen <= 0) throw new IllegalArgumentException(
|
|
||||||
"Must have dot options to guess with."
|
|
||||||
);
|
|
||||||
if (!dups && len > oplen) throw new IllegalArgumentException(
|
|
||||||
"Cant create solution of that length without duplicates."
|
|
||||||
);
|
|
||||||
|
|
||||||
this.dups = dups;
|
|
||||||
this.len = len;
|
|
||||||
this.nguesses = nguesses;
|
|
||||||
this.options = options;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of guesses.
|
|
||||||
interface ILoGuess {
|
|
||||||
WorldImage draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConsGuess implements ILoGuess {
|
|
||||||
|
|
||||||
Guess guess;
|
|
||||||
ILoGuess nxt;
|
|
||||||
|
|
||||||
ConsGuess(Guess guess, ILoGuess nxt) {
|
|
||||||
this.guess = guess;
|
|
||||||
this.nxt = nxt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldImage draw() {
|
|
||||||
return Util.pairGapAbove(guess.draw(), this.nxt.draw());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MtGuess implements ILoGuess {
|
|
||||||
|
|
||||||
public WorldImage draw() {
|
|
||||||
return new EmptyImage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A guess.
|
|
||||||
class Guess {
|
|
||||||
|
|
||||||
ILoDot guess; // The dots the user entered.
|
|
||||||
Feedback feedback; // The feedback returned.
|
|
||||||
|
|
||||||
Guess(ILoDot guess, Feedback feedback) {
|
|
||||||
this.guess = guess;
|
|
||||||
this.feedback = feedback;
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldImage draw() {
|
|
||||||
return Util.pairGap(this.guess.draw(), this.feedback.draw());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A guess in the midst of being entered.
|
|
||||||
class IncompleteGuess {
|
|
||||||
|
|
||||||
ILoDot guessSoFar;
|
|
||||||
|
|
||||||
IncompleteGuess(ILoDot guessSoFar) {
|
|
||||||
this.guessSoFar = guessSoFar;
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldImage draw() {
|
|
||||||
return guessSoFar.draw();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Feedback for a guess.
|
|
||||||
class Feedback {
|
|
||||||
|
|
||||||
int exact, inexact;
|
|
||||||
|
|
||||||
Feedback(int exact, int inexact) {
|
|
||||||
this.exact = exact;
|
|
||||||
this.inexact = inexact;
|
|
||||||
}
|
|
||||||
|
|
||||||
Feedback add(Feedback other) {
|
|
||||||
int otherExact = other.exact, otherInexact = other.inexact;
|
|
||||||
|
|
||||||
return new Feedback(
|
|
||||||
this.exact + otherExact,
|
|
||||||
this.inexact + otherInexact
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldImage draw() {
|
|
||||||
return Util.strPair(
|
|
||||||
String.valueOf(this.exact),
|
|
||||||
String.valueOf(this.exact)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of dots.
|
|
||||||
interface ILoDot {
|
|
||||||
int len(); // Get length.
|
|
||||||
Dot get(int n); // Get nth element.
|
|
||||||
ILoDot remove(int n); // Remove nth element.
|
|
||||||
ILoDot removeAll(ILoInt indices); // Remove element at each index.
|
|
||||||
ILoDot gen(int n); // Generate randomized list.
|
|
||||||
|
|
||||||
boolean match(Color col); // Do the colors match?
|
|
||||||
boolean in(Dot dot); // Is the dot in here?
|
|
||||||
|
|
||||||
Feedback compare(ILoDot other); // Compare two lists & give feedback.
|
|
||||||
ILoInt exactIndices(ILoDot other); // Get indices of exact matches.
|
|
||||||
ILoInt exactIndicesHelper(ILoDot other, int i);
|
|
||||||
int countInexact(ILoDot other); // Get the number of inexact matches. Must be fed exact match-free lists to be accurate.
|
|
||||||
int countInexactHelper(ILoDot other, ILoDot seen);
|
|
||||||
|
|
||||||
WorldImage draw(); // Draw the dots.
|
|
||||||
int getW(); // Get the total width, in pixels, of the list.
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConsDot implements ILoDot {
|
|
||||||
|
|
||||||
Random rand;
|
|
||||||
Dot dot;
|
|
||||||
ILoDot nxt;
|
|
||||||
|
|
||||||
ConsDot(Dot dot, ILoDot nxt, Random rand) {
|
|
||||||
this.rand = rand;
|
|
||||||
this.dot = dot;
|
|
||||||
this.nxt = nxt;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConsDot(Dot dot, ILoDot nxt) {
|
|
||||||
this(dot, nxt, new Random());
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoDot gen(int n) {
|
|
||||||
return n <= 0
|
|
||||||
? new MtDot()
|
|
||||||
: new ConsDot(
|
|
||||||
this.get(this.rand.nextInt(this.len())),
|
|
||||||
this.gen(n - 1)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dot get(int n) {
|
|
||||||
if (n == 0) return this.dot;
|
|
||||||
else return this.nxt.get(n - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean in(Dot dot) {
|
|
||||||
return dot.equals(this.dot) || this.nxt.in(dot);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int len() {
|
|
||||||
return 1 + this.nxt.len();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean match(Color col) {
|
|
||||||
return col.equals(this.dot.c);
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldImage draw() {
|
|
||||||
return new BesideAlignImage(
|
|
||||||
AlignModeY.PINHOLE,
|
|
||||||
this.dot.draw(),
|
|
||||||
Util.gap,
|
|
||||||
this.nxt.draw()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getW() {
|
|
||||||
return this.len() * Dot.r * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Feedback compare(ILoDot other) {
|
|
||||||
if (this.len() != other.len()) throw new IllegalArgumentException(
|
|
||||||
"Cannot compare different lengthed lists."
|
|
||||||
);
|
|
||||||
|
|
||||||
ILoInt exactIndices = this.exactIndices(other);
|
|
||||||
|
|
||||||
ILoDot thisWithoutExact = this.removeAll(exactIndices);
|
|
||||||
ILoDot otherWithoutExact = other.removeAll(exactIndices);
|
|
||||||
|
|
||||||
int exact = exactIndices.len();
|
|
||||||
int inexact = thisWithoutExact.countInexact(otherWithoutExact);
|
|
||||||
|
|
||||||
return new Feedback(exact, inexact);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt exactIndices(ILoDot other) {
|
|
||||||
return this.exactIndicesHelper(other, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt exactIndicesHelper(ILoDot other, int i) {
|
|
||||||
// Stop after reaching the end of the list.
|
|
||||||
if (i == this.len()) return new MtInt();
|
|
||||||
|
|
||||||
return this.get(i).equals(other.get(i))
|
|
||||||
? new ConsInt(i, this.exactIndicesHelper(other, i + 1))
|
|
||||||
: this.exactIndicesHelper(other, i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int countInexact(ILoDot other) {
|
|
||||||
return this.countInexactHelper(other, new MtDot());
|
|
||||||
}
|
|
||||||
|
|
||||||
public int countInexactHelper(ILoDot other, ILoDot seen) {
|
|
||||||
if (seen.in(this.dot)) {
|
|
||||||
return this.nxt.countInexactHelper(
|
|
||||||
other,
|
|
||||||
new ConsDot(this.dot, seen)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
(other.in(this.dot) ? 1 : 0) +
|
|
||||||
this.nxt.countInexactHelper(other, new ConsDot(this.dot, seen))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoDot remove(int n) {
|
|
||||||
if (n < 0) throw new IllegalArgumentException(
|
|
||||||
"Indices must be positive."
|
|
||||||
);
|
|
||||||
|
|
||||||
if (n == 0) return this.nxt;
|
|
||||||
else return new ConsDot(this.dot, this.nxt.remove(n - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoDot removeAll(ILoInt indices) {
|
|
||||||
if (indices.isEmpty()) return this;
|
|
||||||
return this.remove(indices.first()).removeAll(indices.rest().subOne());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MtDot implements ILoDot {
|
|
||||||
|
|
||||||
public ILoDot gen(int n) {
|
|
||||||
return new MtDot();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dot get(int n) {
|
|
||||||
throw new IllegalArgumentException("Index out of bounds.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public int len() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldImage draw() {
|
|
||||||
return new EmptyImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getW() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Feedback compare(ILoDot other) {
|
|
||||||
return new Feedback(0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean match(Color col) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean in(Dot dot) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt exactIndices(ILoDot other) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Empty list doesn't exactly match anything."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt exactIndicesHelper(ILoDot other, int i) {
|
|
||||||
return new MtInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int countInexact(ILoDot other) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int countInexactHelper(ILoDot other, ILoDot seen) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoDot remove(int n) {
|
|
||||||
throw new IllegalArgumentException("Index out of bounds.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoDot removeAll(ILoInt indices) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A dot.
|
|
||||||
class Dot {
|
|
||||||
|
|
||||||
static int r = 16 * Util.scale;
|
|
||||||
static OutlineMode outlineMode = OutlineMode.SOLID;
|
|
||||||
|
|
||||||
Color c;
|
|
||||||
|
|
||||||
Dot(Color c) {
|
|
||||||
this.c = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the dot.
|
|
||||||
WorldImage draw() {
|
|
||||||
return new CircleImage(r, outlineMode, this.c);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the width of the dot.
|
|
||||||
int getW() {
|
|
||||||
return 2 * r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of integers.
|
|
||||||
interface ILoInt {
|
|
||||||
int len(); // Get the length of the list.
|
|
||||||
ILoInt remove(int n); // Remove the nth element of the list.
|
|
||||||
boolean isEmpty(); // Is it empty?
|
|
||||||
int first(); // Get the first value.
|
|
||||||
ILoInt rest(); // Get the rest value.
|
|
||||||
ILoInt subOne(); // Subtract 1 from every int.
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConsInt implements ILoInt {
|
|
||||||
|
|
||||||
int val;
|
|
||||||
ILoInt nxt;
|
|
||||||
|
|
||||||
ConsInt(int val, ILoInt nxt) {
|
|
||||||
this.val = val;
|
|
||||||
this.nxt = nxt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int len() {
|
|
||||||
return 1 + this.nxt.len();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt remove(int n) {
|
|
||||||
if (n < 0) throw new IllegalArgumentException(
|
|
||||||
"Indices must be positive."
|
|
||||||
);
|
|
||||||
return n == 0
|
|
||||||
? this.nxt
|
|
||||||
: new ConsInt(this.val, this.nxt.remove(n - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int first() {
|
|
||||||
return this.val;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt rest() {
|
|
||||||
return this.nxt;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt subOne() {
|
|
||||||
return new ConsInt(this.val - 1, this.nxt.subOne());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MtInt implements ILoInt {
|
|
||||||
|
|
||||||
public int len() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt remove(int n) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Index out of bounds: cannot remove something from nothing."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isEmpty() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int first() {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"Cannot get first element in a list without any."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt rest() {
|
|
||||||
throw new IllegalArgumentException("Cannot get rest of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILoInt subOne() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,7 +0,0 @@
|
|||||||
eclipse.preferences.version=1
|
|
||||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
|
|
||||||
org.eclipse.jdt.core.compiler.compliance=21
|
|
||||||
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
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(String s1, String s2) {
|
|
||||||
return ! this.ordering(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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello))));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,174 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare the sizes of two things with the given Evaluator.
|
|
||||||
class Comp implements IComparator<String> {
|
|
||||||
IEvaluator eval;
|
|
||||||
Comp(IEvaluator eval) {
|
|
||||||
this.eval = eval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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; }
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(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 StringsAfter(new OrderByShortness()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return new StringsAfter(new OrderByAlpha()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return new StringsAfter(new OrderByAlpha()).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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,160 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,82 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,166 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 StringsBefore(new OrderByShortness()).apply(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,156 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
ILo<A> newsort = sorted.insertSorted(comp, this.first);
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(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 OrderByAlpha()).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; }
|
|
||||||
}
|
|
@@ -1,130 +0,0 @@
|
|||||||
package fibonacci;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
|
|
||||||
ISequence<Integer> f;
|
|
||||||
ISequence<String> a;
|
|
||||||
ISeqGen<String> aGen = new AGen();
|
|
||||||
|
|
||||||
void init() {
|
|
||||||
this.f = new Fibonacci();
|
|
||||||
this.a = new GenSeq<String>("", aGen);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testFibonacci(Tester t) {
|
|
||||||
init();
|
|
||||||
t.checkExpect(f.get(), 0);
|
|
||||||
t.checkExpect(f.get(), 1);
|
|
||||||
t.checkExpect(f.get(), 1);
|
|
||||||
t.checkExpect(f.get(), 2);
|
|
||||||
t.checkExpect(f.get(), 3);
|
|
||||||
t.checkExpect(f.get(), 5);
|
|
||||||
t.checkExpect(f.get(), 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
void testASeq(Tester t) {
|
|
||||||
init();
|
|
||||||
t.checkExpect(a.get(), "");
|
|
||||||
t.checkExpect(a.get(), "a");
|
|
||||||
t.checkExpect(a.get(), "aa");
|
|
||||||
t.checkExpect(a.get(), "aaa");
|
|
||||||
t.checkExpect(a.get(), "aaaa");
|
|
||||||
t.checkExpect(a.get(), "aaaaa");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A generic list.
|
|
||||||
interface ILo<A> {}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {}
|
|
||||||
|
|
||||||
interface ISequence<X> {
|
|
||||||
// Returns the current element in the sequence.
|
|
||||||
// EFFECT: Updates the state to the next element in the sequence.
|
|
||||||
X get();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sequence generator method.
|
|
||||||
interface ISeqGen<X> {
|
|
||||||
X gen(X state); // Generates the next value in the sequence given the current state.
|
|
||||||
}
|
|
||||||
|
|
||||||
// The Fibonacci sequence.
|
|
||||||
class Fibonacci implements ISequence<Integer> {
|
|
||||||
|
|
||||||
int idx; // Number of times `get()` has been called.
|
|
||||||
int pre; // The previous (last) number.
|
|
||||||
int pen; // The penultimate (second to last) number.
|
|
||||||
|
|
||||||
Fibonacci() {
|
|
||||||
this.pen = 0;
|
|
||||||
this.pre = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the next in the sequence.
|
|
||||||
public Integer get() {
|
|
||||||
int ret; // What to return.
|
|
||||||
/*
|
|
||||||
|
|
||||||
idx pen pre ret
|
|
||||||
0 0 1 0
|
|
||||||
1 0 1 1
|
|
||||||
2 1 1 2
|
|
||||||
3 1 2 3
|
|
||||||
4 2 3 5
|
|
||||||
5 3 5 8
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
// F(0) = 0; F(1) = 1
|
|
||||||
if (this.idx <= 1) ret = this.idx;
|
|
||||||
else { // F(n) = F(n-1) + F(n-2)
|
|
||||||
ret = this.pre + this.pen;
|
|
||||||
|
|
||||||
this.pen = this.pre;
|
|
||||||
this.pre = ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.idx = this.idx + 1;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A generic sequence.
|
|
||||||
class GenSeq<X> implements ISequence<X> {
|
|
||||||
|
|
||||||
X state; // The current state of the sequence.
|
|
||||||
ISeqGen<X> seqGen; // The method by which new values are generated.
|
|
||||||
|
|
||||||
// Create new generic sequence given an initial state.
|
|
||||||
GenSeq(X init, ISeqGen<X> seqGen) {
|
|
||||||
this.state = init;
|
|
||||||
this.seqGen = seqGen;
|
|
||||||
}
|
|
||||||
|
|
||||||
public X get() {
|
|
||||||
X ret = this.state;
|
|
||||||
this.state = this.seqGen.gen(this.state);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A string of n "a"s.
|
|
||||||
class AGen implements ISeqGen<String> {
|
|
||||||
|
|
||||||
public String gen(String state) {
|
|
||||||
return state.concat("a");
|
|
||||||
}}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 StringsAfter(new OrderByShortness()).apply(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,149 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) >= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello))));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,176 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
ILo<String> hh = new Cons<String>("hh", new Cons<String>("hhhh", new Cons<String>("h", mstr)));
|
|
||||||
ILo<String> hhh = new Cons<String>("a", new Cons<String>("b", new Cons<String>("c", mstr)));
|
|
||||||
ILo<String> hhhh = new Cons<String>("b", new Cons<String>("a", new Cons<String>("c", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoSort(Tester t) {
|
|
||||||
return t.checkExpect(h.sort(new CompStrLen()), h)
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrLen()), mstr)
|
|
||||||
&& t.checkExpect(helloWorld.sort(new CompStrLen()), new Cons<String>("world.", new Cons<String>("Hello, ", mstr)))
|
|
||||||
&& t.checkExpect(hh.sort(new CompStrLen()), h)
|
|
||||||
|
|
||||||
&& t.checkExpect(mstr.sort(new CompStrAlp()), mstr)
|
|
||||||
&& t.checkExpect(hhh.sort(new CompStrAlp()), hhh)
|
|
||||||
&& t.checkExpect(hhhh.sort(new CompStrAlp()), hhh);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare strings alphabetically.
|
|
||||||
class CompStrAlp implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.compareTo(s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compare the sizes of two things with the given Evaluator.
|
|
||||||
class Comp<A> implements IComparator<A> {
|
|
||||||
IEvaluator<A> eval;
|
|
||||||
Comp(IEvaluator<A> eval) {
|
|
||||||
this.eval = eval;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int compare()
|
|
||||||
}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return this.rest.sortHelper(comp, new Cons<A>(this.first, new Mt<A>()));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return this.rest.sortHelper(comp, sorted.insertSorted(comp, this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return comp.compare(a, this.first) <= 0 ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(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 StringsAfter(new OrderByShortness()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return new StringsAfter(new OrderByAlpha()).after(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,94 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
boolean apply(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 OrderByShortness().before(s1, s2);
|
|
||||||
return new StringsBefore(new OrderByShortness()).apply(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,147 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,5 +0,0 @@
|
|||||||
package fibonacci;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
|
|
||||||
}
|
|
@@ -1,153 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) <= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
|
|
||||||
return comp.compare(a, this.first) ? new Cons<A>(a ,this) : new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,93 +0,0 @@
|
|||||||
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 a IStringsBefore.
|
|
||||||
class StringsAfter {
|
|
||||||
IStringsBefore ordering;
|
|
||||||
|
|
||||||
StringsAfter(IStringsBefore ordering) { this.ordering = ordering; }
|
|
||||||
|
|
||||||
apply(String s1, String s2) {
|
|
||||||
return ! this.ordering(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 OrderByShortness().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByUnalpha implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByAlpha().before(s1, s2);
|
|
||||||
}}
|
|
||||||
|
|
||||||
class OrderByDisorder implements IStringsBefore { public boolean before(String s1, String s2) {
|
|
||||||
return ! new OrderByOrder().before(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; }
|
|
||||||
}
|
|
@@ -1,151 +0,0 @@
|
|||||||
package generics;
|
|
||||||
|
|
||||||
import tester.Tester;
|
|
||||||
|
|
||||||
class Examples {
|
|
||||||
ILo<Integer> mint = new Mt<Integer>();
|
|
||||||
ILo<Integer> lint = new Cons<Integer>(1, new Cons<Integer>(92, new Cons<Integer>(-12, mint)));
|
|
||||||
ILo<Integer> lint2 = new Cons<Integer>(1, new Cons<Integer>(1, mint));
|
|
||||||
|
|
||||||
ILo<String> mstr = new Mt<String>();
|
|
||||||
ILo<String> hello = new Cons<String>("Hello, ", mstr);
|
|
||||||
ILo<String> world = new Cons<String>("world.", mstr);
|
|
||||||
ILo<String> ajcmsdj = new Cons<String>("ajcmsdj", mstr);
|
|
||||||
ILo<String> helloWorld = new Cons<String>("Hello, ", new Cons<String>("world.", mstr));
|
|
||||||
ILo<String> helloAjcmsdj = new Cons<String>("Hello, ", ajcmsdj);
|
|
||||||
ILo<String> h = new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhhh", mstr)));
|
|
||||||
|
|
||||||
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 StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(helloAjcmsdj.argmax(new StrLen()), "Hello, ")
|
|
||||||
&& t.checkExpect(lint2.argmax(new IntSize()), 1)
|
|
||||||
&& t.checkExpect(lint.argmax(new IntSize()), 92);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean testILoInsertSorted(Tester t) {
|
|
||||||
return t.checkExpect(mstr.insertSorted(new CompStrLen(), "h"), new Cons<String>("h", mstr))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "s"), new Cons<String>("s", hello))
|
|
||||||
&& t.checkExpect(h.insertSorted(new CompStrLen(), "hhh"), new Cons<String>("h", new Cons<String>("hh", new Cons<String>("hhh", new Cons<String>("hhhh", mstr)))))
|
|
||||||
&& t.checkExpect(hello.insertSorted(new CompStrLen(), "hello"), new Cons<String>("hello", hello));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generic function.
|
|
||||||
interface IFunc<X, Y> {
|
|
||||||
Y apply(X input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extracts the value of an input.
|
|
||||||
interface IEvaluator<X> extends IFunc<X, Integer> {}
|
|
||||||
|
|
||||||
// Calculate the length of a string.
|
|
||||||
class StrLen implements IEvaluator<String> { public Integer apply(String input) {
|
|
||||||
return input.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Calculate the size of an integer.
|
|
||||||
class IntSize implements IEvaluator<Integer> { public Integer apply(Integer input) {
|
|
||||||
return input;
|
|
||||||
}}
|
|
||||||
|
|
||||||
// Compares two values.
|
|
||||||
interface IComparator<A> {
|
|
||||||
// Returns a negative number if a1 is "smaller" than a2,
|
|
||||||
// 0 if they are considered equal,
|
|
||||||
// and a positive number of a1 is "bigger" than a2.
|
|
||||||
int compare(A a1, A a2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare string lengths.
|
|
||||||
class CompStrLen implements IComparator<String> { public int compare(String s1, String s2) {
|
|
||||||
return s1.length() - s2.length();
|
|
||||||
}}
|
|
||||||
|
|
||||||
// A list of A.
|
|
||||||
interface ILo<A> {
|
|
||||||
// Append a list.
|
|
||||||
ILo<A> append(ILo<A> a);
|
|
||||||
// Find the largest from the evaluator.
|
|
||||||
A argmax(IEvaluator<A> eval);
|
|
||||||
A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal);
|
|
||||||
// Skip this element of the list.
|
|
||||||
ILo<A> skip();
|
|
||||||
// Sort the list with the comparator.
|
|
||||||
ILo<A> sort(IComparator<A> comp);
|
|
||||||
ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted);
|
|
||||||
// Add an element to the correct place in a sorted list.
|
|
||||||
ILo<A> insertSorted(IComparator<A> comp, A a);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Cons<A> implements ILo<A> {
|
|
||||||
A first;
|
|
||||||
ILo<A> rest;
|
|
||||||
|
|
||||||
Cons(A first, ILo<A> rest) {
|
|
||||||
this.first = first;
|
|
||||||
this.rest = rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> append(ILo<A> a) { return new Cons<A>(this.first, this.rest.append(a)); }
|
|
||||||
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
return argmaxHelper(eval, this.first, eval.apply(this.first));
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> 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<A> skip() {
|
|
||||||
return this.rest;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
if (comp.compare(a, this.first) <= 0) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
} else {
|
|
||||||
return new Cons<A>(this.first, this.rest.insertSorted(comp, a));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Mt<A> implements ILo<A> {
|
|
||||||
public ILo<A> append(ILo<A> a) { return a; }
|
|
||||||
public A argmax(IEvaluator<A> eval) {
|
|
||||||
throw new UnsupportedOperationException("No max of empty list.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public A argmaxHelper(IEvaluator<A> eval, A prev, Integer prevVal) {
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ILo<A> skip() { return this; }
|
|
||||||
|
|
||||||
public ILo<A> sort(IComparator<A> comp) { return this; }
|
|
||||||
public ILo<A> sortHelper(IComparator<A> comp, ILo<A> sorted) {
|
|
||||||
return sorted;
|
|
||||||
}
|
|
||||||
public ILo<A> insertSorted(IComparator<A> comp, A a) {
|
|
||||||
return new Cons<A>(a, this);
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
#GitProjectData
|
#GitProjectData
|
||||||
#Wed Nov 13 09:09:56 EST 2024
|
#Thu Nov 21 00:04:34 EST 2024
|
||||||
.gitdir=../.git
|
.gitdir=../.git
|
||||||
|
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
#GitProjectData
|
#GitProjectData
|
||||||
#Tue Nov 05 15:25:59 EST 2024
|
#Thu Nov 21 00:04:34 EST 2024
|
||||||
.gitdir=../.git
|
.gitdir=../.git
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
#GitProjectData
|
#GitProjectData
|
||||||
#Mon Nov 18 11:29:02 EST 2024
|
#Thu Nov 21 00:04:34 EST 2024
|
||||||
.gitdir=../.git
|
.gitdir=../.git
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,3 +1,3 @@
|
|||||||
#GitProjectData
|
#GitProjectData
|
||||||
#Tue Nov 12 12:12:54 EST 2024
|
#Thu Nov 21 00:04:34 EST 2024
|
||||||
.gitdir=../.git
|
.gitdir=../.git
|
||||||
|
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user