Skip to content
Snippets Groups Projects

Resolve "Java memoizer"

Merged Colin DAMON requested to merge 120-java-memoizer into master
7 files
+ 156
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