package com.github.liblevenshtein.collection.dictionary.factory;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import com.github.liblevenshtein.collection.dictionary.Dawg;
import com.github.liblevenshtein.collection.dictionary.DawgNode;
import com.github.liblevenshtein.collection.dictionary.IFinalFunction;
import com.github.liblevenshtein.collection.dictionary.ITransitionFunction;
import com.github.liblevenshtein.collection.dictionary.SortedDawg;
/**
* Constructs DAWG instances.
* @author Dylon Edwards
* @since 2.1.0
*/
@Slf4j
public class DawgFactory implements Serializable {
private static final long serialVersionUID = 1L;
/**
* Returns a new DAWG.
* @param terms Terms to insert into the DAWG
* @return A new DAWG, containing the terms.
*/
public Dawg build(@NonNull final Collection<String> terms) {
return build(terms, false);
}
/**
* Returns a new DAWG.
* @param terms Terms to insert into the DAWG
* @param isSorted Whether terms has been sorted
* @return A new DAWG, containing the terms.
*/
public Dawg build(
@NonNull final Collection<String> terms,
final boolean isSorted) {
if (terms instanceof SortedDawg) {
return (SortedDawg) terms;
}
if (!isSorted) {
if (!(terms instanceof List)) {
return build(new ArrayList<String>(terms), false);
}
Collections.sort((List<String>) terms);
}
return new SortedDawg(terms);
}
/**
* Returns the final function of the dictionary.
* @param dictionary Dawg whose final function should be returned
* @return The final function of the dictionary
*/
public IFinalFunction<DawgNode> finalFunction(@NonNull final Dawg dictionary) {
return dictionary;
}
/**
* Returns the transition function of the dictionary.
* @param dictionary Dawg whose transition function should be returned
* @return The transition function of the dictionary
*/
public ITransitionFunction<DawgNode> transitionFunction(@NonNull final Dawg dictionary) {
return dictionary;
}
}