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