Skip to content

Commit ac4e44e

Browse files
authored
Add $.memoize(function) method.
1 parent fdacc47 commit ac4e44e

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

src/main/java/com/github/underscore/$.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,10 +1294,19 @@ public List<List<T>> chunk(final int size) {
12941294
return chunk(getIterable(), size);
12951295
}
12961296

1297-
public static <T, F> Function1<T, F> bind(final Function1<T, F> function) {
1298-
return new Function1<T, F>() {
1297+
public static <T, F> Function1<F, T> bind(final Function1<F, T> function) {
1298+
return new Function1<F, T>() {
12991299
@Override
1300-
public F apply(T arg) {
1300+
public T apply(F arg) {
1301+
return function.apply(arg);
1302+
}
1303+
};
1304+
}
1305+
1306+
public static <T, F> Function1<F, T> memoize(final Function1<F, T> function) {
1307+
return new MemoizeFunction1<F, T>() {
1308+
@Override
1309+
public T calc(F arg) {
13011310
return function.apply(arg);
13021311
}
13031312
};

src/main/java/com/github/underscore/MemoizeFunction1.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.github.underscore;
22

3-
import java.util.HashMap;
3+
import java.util.LinkedHashMap;
44
import java.util.Map;
55

6-
public abstract class MemoizeFunction1<T> implements Function1<T, T> {
7-
private final Map<T, T> cache = new HashMap<T, T>();
8-
public abstract T calc(final T n);
6+
public abstract class MemoizeFunction1<F, T> implements Function1<F, T> {
7+
private final Map<F, T> cache = new LinkedHashMap<F, T>();
8+
public abstract T calc(final F n);
99

10-
public T apply(final T key) {
10+
public T apply(final F key) {
1111
if (!cache.containsKey(key)) {
1212
cache.put(key, calc(key));
1313
}

src/test/java/com/github/underscore/FunctionsTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,19 @@ public Integer apply(final Integer arg2) {
8484
*/
8585
@Test
8686
public void memoize() {
87-
class FibonacciFuncion1 extends MemoizeFunction1<Integer> {
87+
class FibonacciFuncion1 extends MemoizeFunction1<Integer, Integer> {
8888
public Integer calc(final Integer n) {
8989
return n < 2 ? n : apply(n - 1) + apply(n - 2);
9090
}
9191
}
9292
assertEquals(55, new FibonacciFuncion1().apply(10).intValue());
93+
Function1<Integer, Integer> memoizeFunction = $.memoize(
94+
new Function1<Integer, Integer>() {
95+
public Integer apply(final Integer n) {
96+
return n < 2 ? n : apply(n - 1) + apply(n - 2);
97+
}
98+
});
99+
assertEquals(55, memoizeFunction.apply(10).intValue());
93100
}
94101

95102
/*

0 commit comments

Comments
 (0)