001package org.nasdanika.ai; 002 003import java.util.function.Function; 004 005import reactor.core.publisher.Mono; 006 007/** 008 * Computes pair-wise similarity 009 * @param <T> 010 * @param <S> 011 */ 012public interface SimilarityComputer<T,S> { 013 014 default S compute(T a, T b) { 015 return computeAsync(a, b).block(); 016 } 017 018 Mono<S> computeAsync(T a, T b); 019 020 default Mono<S> computeAsync(Mono<T> a, Mono<T> b) { 021 return Mono.zip(a, b).flatMap(t -> computeAsync(t.getT1(), t.getT2())); 022 } 023 024 default <V> SimilarityComputer<V,S> adapt(Function<V,Mono<T>> mapper) { 025 026 return new SimilarityComputer<V, S>() { 027 028 @Override 029 public Mono<S> computeAsync(V a, V b) { 030 Mono<T> ma = mapper.apply(a); 031 Mono<T> mb = mapper.apply(b); 032 return SimilarityComputer.this.computeAsync(ma, mb); 033 } 034 035 @Override 036 public Mono<S> computeAsync(Mono<V> a, Mono<V> b) { 037 Mono<T> ma = a.flatMap(mapper); 038 Mono<T> mb = b.flatMap(mapper); 039 return SimilarityComputer.this.computeAsync(ma, mb); 040 } 041 042 }; 043 044 } 045 046}