// Path: src/main/java/io/aif/language/sentence/separators/extractors/ISeparatorExtractor.java
// public interface ISeparatorExtractor extends IExtractor<List<String>, List<Character>> {
// 
//   public static enum Type {
//     PREDEFINED(new PredefinedSeparatorExtractor()),
//     PROBABILITY(new StatSeparatorExtractor()),
//     NON_ALPHABETIC_CHARACTERS_EXTRACTOR(new NonAlphabeticCharactersExtractor());
// 
//     private final ISeparatorExtractor instance;
// 
//     private Type(final ISeparatorExtractor instance) {
//       this.instance = instance;
//     }
// 
//     public static ISeparatorExtractor getDefault() {
//       final ISettings settings = Guice.createInjector(new SettingsModule()).getInstance(ISettings.class);
//       return settings.useIsAlphabeticMethod() ?
//           Type.NON_ALPHABETIC_CHARACTERS_EXTRACTOR.getInstance() :
//           Type.PROBABILITY.getInstance();
//     }
// 
//     public ISeparatorExtractor getInstance() {
//       return instance;
//     }
// 
//   }
// 
// 
// }
// 
// Path: src/main/java/io/aif/language/sentence/separators/groupers/ISeparatorsGrouper.java
// public interface ISeparatorsGrouper {
// 
//   public List<Set<Character>> group(final List<String> tokens, final List<Character> splitters);
// 
//   public enum Type {
// 
//     PREDEFINED(new PredefinedGrouper()),
//     PROBABILITY(new StatGrouper());
// 
//     private final ISeparatorsGrouper instance;
// 
//     Type(ISeparatorsGrouper instance) {
//       this.instance = instance;
//     }
// 
//     public ISeparatorsGrouper getInstance() {
//       return instance;
//     }
// 
//   }
// 
// }


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import io.aif.language.sentence.separators.classificators.ISeparatorGroupsClassifier;
import io.aif.language.sentence.separators.extractors.ISeparatorExtractor;
import io.aif.language.sentence.separators.groupers.ISeparatorsGrouper;
package io.aif.language.sentence.splitters;



class HeuristicSentenceSplitter extends AbstractSentenceSplitter {

  public HeuristicSentenceSplitter(final ISeparatorExtractor sentenceSeparatorExtractor,
                                   final ISeparatorsGrouper sentenceSeparatorsGrouper,
                                   final ISeparatorGroupsClassifier
                                       sentenceSeparatorGroupsClassificatory) {
    super(sentenceSeparatorExtractor, sentenceSeparatorsGrouper, sentenceSeparatorGroupsClassificatory);
  }

  public HeuristicSentenceSplitter() {
    this(ISeparatorExtractor.Type.getDefault(),
        ISeparatorsGrouper.Type.PROBABILITY.getInstance(),
        ISeparatorGroupsClassifier.Type.PROBABILITY.getInstance());
  }

  @Override
  public List<Boolean> split(final List<String> tokens,
                             final Map<ISeparatorGroupsClassifier.Group, Set<Character>>
                                 splitters) {
    final Map<ISeparatorGroupsClassifier.Group, Map<Character, Double>> connections =
        new HashMap<>();
    connections.put(ISeparatorGroupsClassifier.Group.GROUP_1, new HashMap<>());
    connections.put(ISeparatorGroupsClassifier.Group.GROUP_2, new HashMap<>());

// Path: src/main/java/io/aif/language/sentence/separators/extractors/ISeparatorExtractor.java
// public interface ISeparatorExtractor extends IExtractor<List<String>, List<Character>> {
// 
//   public static enum Type {
//     PREDEFINED(new PredefinedSeparatorExtractor()),
//     PROBABILITY(new StatSeparatorExtractor()),
//     NON_ALPHABETIC_CHARACTERS_EXTRACTOR(new NonAlphabeticCharactersExtractor());
// 
//     private final ISeparatorExtractor instance;
// 
//     private Type(final ISeparatorExtractor instance) {
//       this.instance = instance;
//     }
// 
//     public static ISeparatorExtractor getDefault() {
//       final ISettings settings = Guice.createInjector(new SettingsModule()).getInstance(ISettings.class);
//       return settings.useIsAlphabeticMethod() ?
//           Type.NON_ALPHABETIC_CHARACTERS_EXTRACTOR.getInstance() :
//           Type.PROBABILITY.getInstance();
//     }
// 
//     public ISeparatorExtractor getInstance() {
//       return instance;
//     }
// 
//   }
// 
// 
// }
// 
// Path: src/main/java/io/aif/language/sentence/separators/groupers/ISeparatorsGrouper.java
// public interface ISeparatorsGrouper {
// 
//   public List<Set<Character>> group(final List<String> tokens, final List<Character> splitters);
// 
//   public enum Type {
// 
//     PREDEFINED(new PredefinedGrouper()),
//     PROBABILITY(new StatGrouper());
// 
//     private final ISeparatorsGrouper instance;
// 
//     Type(ISeparatorsGrouper instance) {
//       this.instance = instance;
//     }
// 
//     public ISeparatorsGrouper getInstance() {
//       return instance;
//     }
// 
//   }
// 
// }


// Path: src/main/java/io/aif/language/sentence/splitters/HeuristicSentenceSplitter.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import io.aif.language.sentence.separators.classificators.ISeparatorGroupsClassifier;
import io.aif.language.sentence.separators.extractors.ISeparatorExtractor;
import io.aif.language.sentence.separators.groupers.ISeparatorsGrouper;

package io.aif.language.sentence.splitters;



class HeuristicSentenceSplitter extends AbstractSentenceSplitter {

  public HeuristicSentenceSplitter(final ISeparatorExtractor sentenceSeparatorExtractor,
                                   final ISeparatorsGrouper sentenceSeparatorsGrouper,
                                   final ISeparatorGroupsClassifier
                                       sentenceSeparatorGroupsClassificatory) {
    super(sentenceSeparatorExtractor, sentenceSeparatorsGrouper, sentenceSeparatorGroupsClassificatory);
  }

  public HeuristicSentenceSplitter() {
    this(ISeparatorExtractor.Type.getDefault(),
        ISeparatorsGrouper.Type.PROBABILITY.getInstance(),
        ISeparatorGroupsClassifier.Type.PROBABILITY.getInstance());
  }

  @Override
  public List<Boolean> split(final List<String> tokens,
                             final Map<ISeparatorGroupsClassifier.Group, Set<Character>>
                                 splitters) {
    final Map<ISeparatorGroupsClassifier.Group, Map<Character, Double>> connections =
        new HashMap<>();
    connections.put(ISeparatorGroupsClassifier.Group.GROUP_1, new HashMap<>());
    connections.put(ISeparatorGroupsClassifier.Group.GROUP_2, new HashMap<>());

    for (int i = 0; i < tokens.size() - 1; i++) {