// Path: src/de/unitrier/daalft/pali/cache/CachedDictionaryLookup.java
// public class CachedDictionaryLookup {
// 
// 	private Cache<JObject[]> cache;
// 	private LexiconAdapter lexiconAdapter;
// 	private HashSet<String> invalid;
// 	
// 	public CachedDictionaryLookup(String domain, int port, String user, String pw, int maxCacheSize, int maxCacheDurationInSeconds) throws Exception {
// 		invalid = new HashSet<>();
// 		cache = new Cache<JObject[]>(maxCacheSize, maxCacheDurationInSeconds);
// 		lexiconAdapter = new LexiconAdapter(domain, port, user, pw);
// 	}
// 		
// 	public boolean lemmaExists(String lemma) {
// 		return (cache.get(lemma, false) != null);
// 	}
// 
// 	public JObject[] getLemmata (String lemma) throws Exception {
// 		if (invalid.contains(lemma))
// 			return null;
// 		JObject[] lemmata = cache.get(lemma, false);
// 		if (lemmata != null) {
// 			return lemmata;
// 		}
// 		lemmata = lexiconAdapter.getLemmaEntriesAsJObjectArray(lemma);
// 		if (lemmata == null) {
// 			invalid.add(lemma);
// 			return null;
// 		}
// 		cache.put(lemma, lemmata);
// 		return lemmata;
// 	}
// }
// 
// Path: src/de/unitrier/daalft/pali/phonology/element/Rule.java
// public class Rule {
// 
// 	private String left, right;
// 
// 	////////////////////////////////////////////////////
// 	// Constructors
// 	////////////////////////////////////////////////////
// 	
// 	public Rule() {
// 
// 	}
// 	
// 	public Rule(String l, String r) {
// 		left = l.trim();
// 		right = r.trim().replace("\\", "$");
// 	}
// 
// 	public Rule(Token[] array) {
// 		left = strip(array[0]).trim();
// 		right = strip(array[2]).trim().replace("\\", "$");
// 	}
// 
// 	public Rule(List<Token> ret) {
// 		this(ret.toArray(new Token[3]));
// 	}
// 
// 	////////////////////////////////////////////////////
// 	// Methods
// 	////////////////////////////////////////////////////
// 	
// 	public boolean isApplicable(String s) {
// 		return s.matches(".*"+left+".*");
// 	}
// 
// 	public String applyFirst(String s) {
// 		return s.replaceFirst(left, right);
// 	}
// 
// 	public String applyAll(String s) {
// 		return s.replaceAll(left, right);
// 	}
// 
// 	@Override
// 	public String toString () {
// 		return left + " -> " + right;
// 	}
// 
// 	private String strip(Token t) {
// 		String tr = t.toString();
// 		int l = tr.length()-1;
// 		return tr.substring(1, l);
// 	}
// }


import java.io.*;
import java.util.*;
import de.unitrier.daalft.pali.cache.CachedDictionaryLookup;
import de.unitrier.daalft.pali.phonology.element.Rule;
import de.unitrier.daalft.pali.phonology.tools.*;

package de.unitrier.daalft.pali.phonology;


/**
 * A rule-based sandhi splitter
 * @author David
 *
 */
public class SandhiSolver {

	enum RuleSet {
		RULE_SET_A, RULE_SET_B, SPECIAL_RULE
	}
	
	/**
	 * Rule set
	 */
	private List<Rule> ruleSetA, ruleSetB, specialRule;
	

// Path: src/de/unitrier/daalft/pali/cache/CachedDictionaryLookup.java
// public class CachedDictionaryLookup {
// 
// 	private Cache<JObject[]> cache;
// 	private LexiconAdapter lexiconAdapter;
// 	private HashSet<String> invalid;
// 	
// 	public CachedDictionaryLookup(String domain, int port, String user, String pw, int maxCacheSize, int maxCacheDurationInSeconds) throws Exception {
// 		invalid = new HashSet<>();
// 		cache = new Cache<JObject[]>(maxCacheSize, maxCacheDurationInSeconds);
// 		lexiconAdapter = new LexiconAdapter(domain, port, user, pw);
// 	}
// 		
// 	public boolean lemmaExists(String lemma) {
// 		return (cache.get(lemma, false) != null);
// 	}
// 
// 	public JObject[] getLemmata (String lemma) throws Exception {
// 		if (invalid.contains(lemma))
// 			return null;
// 		JObject[] lemmata = cache.get(lemma, false);
// 		if (lemmata != null) {
// 			return lemmata;
// 		}
// 		lemmata = lexiconAdapter.getLemmaEntriesAsJObjectArray(lemma);
// 		if (lemmata == null) {
// 			invalid.add(lemma);
// 			return null;
// 		}
// 		cache.put(lemma, lemmata);
// 		return lemmata;
// 	}
// }
// 
// Path: src/de/unitrier/daalft/pali/phonology/element/Rule.java
// public class Rule {
// 
// 	private String left, right;
// 
// 	////////////////////////////////////////////////////
// 	// Constructors
// 	////////////////////////////////////////////////////
// 	
// 	public Rule() {
// 
// 	}
// 	
// 	public Rule(String l, String r) {
// 		left = l.trim();
// 		right = r.trim().replace("\\", "$");
// 	}
// 
// 	public Rule(Token[] array) {
// 		left = strip(array[0]).trim();
// 		right = strip(array[2]).trim().replace("\\", "$");
// 	}
// 
// 	public Rule(List<Token> ret) {
// 		this(ret.toArray(new Token[3]));
// 	}
// 
// 	////////////////////////////////////////////////////
// 	// Methods
// 	////////////////////////////////////////////////////
// 	
// 	public boolean isApplicable(String s) {
// 		return s.matches(".*"+left+".*");
// 	}
// 
// 	public String applyFirst(String s) {
// 		return s.replaceFirst(left, right);
// 	}
// 
// 	public String applyAll(String s) {
// 		return s.replaceAll(left, right);
// 	}
// 
// 	@Override
// 	public String toString () {
// 		return left + " -> " + right;
// 	}
// 
// 	private String strip(Token t) {
// 		String tr = t.toString();
// 		int l = tr.length()-1;
// 		return tr.substring(1, l);
// 	}
// }


// Path: src/de/unitrier/daalft/pali/phonology/SandhiSolver.java
import java.io.*;
import java.util.*;
import de.unitrier.daalft.pali.cache.CachedDictionaryLookup;
import de.unitrier.daalft.pali.phonology.element.Rule;
import de.unitrier.daalft.pali.phonology.tools.*;

package de.unitrier.daalft.pali.phonology;


/**
 * A rule-based sandhi splitter
 * @author David
 *
 */
public class SandhiSolver {

	enum RuleSet {
		RULE_SET_A, RULE_SET_B, SPECIAL_RULE
	}
	
	/**
	 * Rule set
	 */
	private List<Rule> ruleSetA, ruleSetB, specialRule;
	

	private CachedDictionaryLookup cachedDictionaryLookup;
