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