// Path: src/main/java/io/aif/language/common/IDictBuilder.java
// public interface IDictBuilder<T, R> {
// 
//   public IDict<R> build(final T tokens);
// 
// }
// 
// Path: src/main/java/io/aif/language/common/IGrouper.java
// public interface IGrouper {
// 
//   public List<Set<String>> group(final Collection<String> tokens);
// }
// 
// Path: src/main/java/io/aif/language/common/IMapper.java
// @FunctionalInterface
// public interface IMapper<T, S> extends Function<T, S> {
// 
//   public S map(final T nestedList);
// 
//   @Override
//   default S apply(final T t) {
//     return map(t);
//   }
// 
//   default List<S> mapAll(final List<T> elements) {
//     return elements
//         .parallelStream()
//         .map(this)
//         .collect(Collectors.toList());
//   }
// 
// }
// 
// Path: src/main/java/io/aif/language/token/comparator/ITokenComparator.java
// public interface ITokenComparator {
// 
//   public static ITokenComparator createComposite(final Map<ITokenComparator, Double> comparators) {
//     return new CompositeTokenComparator(comparators);
//   }
// 
//   public static ITokenComparator defaultComparator() {
//     return Type.CHARACTER_DENSITY_COMPARATOR.getInstance();
//   }
// 
//   public Double compare(String left, String right);
// 
//   public static enum Type {
//     SIMPLE_TOKEN_COMPARATOR(new SimpleTokenComparator()),
//     RECURSIVE_SUBSTRING_COMPARATOR(new RecursiveSubstringComparator()),
//     CHARACTER_DENSITY_COMPARATOR(new CharacterDensityTokenComparator()),
//     LEVENSHTEIN_COMPARATOR(new LevenshteinDistanceComparator());
// 
//     private final ITokenComparator instance;
// 
//     private Type(final ITokenComparator instance) {
//       this.instance = instance;
//     }
// 
//     public ITokenComparator getInstance() {
//       return instance;
//     }
//   }
// }
// 
// Path: src/main/java/io/aif/language/word/IWord.java
// public interface IWord {
// 
//   public String getRootToken();
// 
//   public Set<String> getAllTokens();
// 
//   public Long getCount();
// 
//   public int getTokenCount(String token);
// 
//   public static interface IWordPlaceholder {
// 
//     public IWord getWord();
// 
//     public String getToken();
// 
//   }
// 
// }
// 
// Path: src/main/java/io/aif/language/word/comparator/IGroupComparator.java
// public interface IGroupComparator {
// 
//   public static IGroupComparator createDefaultInstance(final ITokenComparator tokenComparator) {
//     return new OptimisedMeshComparator(tokenComparator);
//   }
// 
//   public double compare(final Collection<String> t1, final Collection<String> t2);
// 
//   public enum Type {
//     PRIMITIVE(new PrimitiveComparator());
// 
//     private final IGroupComparator setComparator;
// 
//     Type(IGroupComparator setComparator) {
//       this.setComparator = setComparator;
//     }
// 
//     public IGroupComparator getComparator() {
//       return setComparator;
//     }
// 
//   }
// 
// }


import org.apache.log4j.Logger;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import io.aif.language.common.IDict;
import io.aif.language.common.IDictBuilder;
import io.aif.language.common.IGrouper;
import io.aif.language.common.IMapper;
import io.aif.language.token.comparator.ITokenComparator;
import io.aif.language.word.IWord;
import io.aif.language.word.comparator.IGroupComparator;
package io.aif.language.word.dict;




public class DictBuilder implements IDictBuilder<Collection<String>, IWord> {

  private static final Logger logger = Logger.getLogger(DictBuilder.class);

  private final IGrouper grouper;

// Path: src/main/java/io/aif/language/common/IDictBuilder.java
// public interface IDictBuilder<T, R> {
// 
//   public IDict<R> build(final T tokens);
// 
// }
// 
// Path: src/main/java/io/aif/language/common/IGrouper.java
// public interface IGrouper {
// 
//   public List<Set<String>> group(final Collection<String> tokens);
// }
// 
// Path: src/main/java/io/aif/language/common/IMapper.java
// @FunctionalInterface
// public interface IMapper<T, S> extends Function<T, S> {
// 
//   public S map(final T nestedList);
// 
//   @Override
//   default S apply(final T t) {
//     return map(t);
//   }
// 
//   default List<S> mapAll(final List<T> elements) {
//     return elements
//         .parallelStream()
//         .map(this)
//         .collect(Collectors.toList());
//   }
// 
// }
// 
// Path: src/main/java/io/aif/language/token/comparator/ITokenComparator.java
// public interface ITokenComparator {
// 
//   public static ITokenComparator createComposite(final Map<ITokenComparator, Double> comparators) {
//     return new CompositeTokenComparator(comparators);
//   }
// 
//   public static ITokenComparator defaultComparator() {
//     return Type.CHARACTER_DENSITY_COMPARATOR.getInstance();
//   }
// 
//   public Double compare(String left, String right);
// 
//   public static enum Type {
//     SIMPLE_TOKEN_COMPARATOR(new SimpleTokenComparator()),
//     RECURSIVE_SUBSTRING_COMPARATOR(new RecursiveSubstringComparator()),
//     CHARACTER_DENSITY_COMPARATOR(new CharacterDensityTokenComparator()),
//     LEVENSHTEIN_COMPARATOR(new LevenshteinDistanceComparator());
// 
//     private final ITokenComparator instance;
// 
//     private Type(final ITokenComparator instance) {
//       this.instance = instance;
//     }
// 
//     public ITokenComparator getInstance() {
//       return instance;
//     }
//   }
// }
// 
// Path: src/main/java/io/aif/language/word/IWord.java
// public interface IWord {
// 
//   public String getRootToken();
// 
//   public Set<String> getAllTokens();
// 
//   public Long getCount();
// 
//   public int getTokenCount(String token);
// 
//   public static interface IWordPlaceholder {
// 
//     public IWord getWord();
// 
//     public String getToken();
// 
//   }
// 
// }
// 
// Path: src/main/java/io/aif/language/word/comparator/IGroupComparator.java
// public interface IGroupComparator {
// 
//   public static IGroupComparator createDefaultInstance(final ITokenComparator tokenComparator) {
//     return new OptimisedMeshComparator(tokenComparator);
//   }
// 
//   public double compare(final Collection<String> t1, final Collection<String> t2);
// 
//   public enum Type {
//     PRIMITIVE(new PrimitiveComparator());
// 
//     private final IGroupComparator setComparator;
// 
//     Type(IGroupComparator setComparator) {
//       this.setComparator = setComparator;
//     }
// 
//     public IGroupComparator getComparator() {
//       return setComparator;
//     }
// 
//   }
// 
// }


// Path: src/main/java/io/aif/language/word/dict/DictBuilder.java
import org.apache.log4j.Logger;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import io.aif.language.common.IDict;
import io.aif.language.common.IDictBuilder;
import io.aif.language.common.IGrouper;
import io.aif.language.common.IMapper;
import io.aif.language.token.comparator.ITokenComparator;
import io.aif.language.word.IWord;
import io.aif.language.word.comparator.IGroupComparator;

package io.aif.language.word.dict;




public class DictBuilder implements IDictBuilder<Collection<String>, IWord> {

  private static final Logger logger = Logger.getLogger(DictBuilder.class);

  private final IGrouper grouper;

  private final IMapper<WordMapper.DataForMapping, IWord> groupToWordMapper;