Skip to content
Snippets Groups Projects

Resolve "Java memoizer"

Merged Colin DAMON requested to merge 120-java-memoizer into master
7 files
+ 179
0
Compare changes
  • Side-by-side
  • Inline
Files
7
 
package fr.craft.memoizer;
 
 
import java.util.Map;
 
import java.util.concurrent.ConcurrentHashMap;
 
import java.util.function.Function;
 
import java.util.function.Supplier;
 
 
public final class Memoizers {
 
 
private Memoizers() {
 
}
 
 
public static <Result> Supplier<Result> of(
 
Supplier<Result> supplier) {
 
return () -> of(dummy -> supplier.get()).apply(null);
 
}
 
 
public static <Input, Result> Function<Input, Result> of(
 
Function<Input, Result> function) {
 
return new MemoizedFunction<>(function);
 
}
 
 
private static class MemoizedFunction<Input, Result>
 
implements Function<Input, Result> {
 
 
private final Function<Input, Result> function;
 
private final Map<MemoizedInput<Input>, MemoizedResult<Result>> results = new ConcurrentHashMap<>();
 
 
public MemoizedFunction(
 
Function<Input, Result> function) {
 
this.function = function;
 
}
 
 
@Override
 
public Result apply(Input input) {
 
return results
 
.computeIfAbsent(new MemoizedInput<>(input),
 
this::toMemoizedResult)
 
.result();
 
}
 
 
private MemoizedResult<Result> toMemoizedResult(
 
MemoizedInput<Input> input) {
 
return new MemoizedResult<>(
 
function.apply(input.input()));
 
}
 
 
private static record MemoizedInput<Input> (
 
Input input) {
 
}
 
 
private static record MemoizedResult<Result> (
 
Result result) {
 
}
 
}
 
}
Loading