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}