int PredictNextPhraseWord(List <int> prefix) { int word; if (_dictionaryList.Count != 0) { var plumber = Plumber <int[]> .Create(prefix.ToArray(), GetPrefixDepth, Comparer, _dictionaryList.Count); var sliceEnumerable = plumber.GetDepthSlices(); using (var sliceEnumerator = sliceEnumerable.GetEnumerator()) { var sliceMoveNext = sliceEnumerator.MoveNext(); Debug.Assert(sliceMoveNext, "There must be a first slice"); var slice = sliceEnumerator.Current; if (slice.Start != 0 || slice.Limit != _dictionaryList.Count) { var suggestions = GetSliceSuggestions(slice.Start, slice.Limit, slice.Limit, slice.Limit); using (var enumerator = suggestions.GetEnumerator()) { var suggestionMoveNext = enumerator.MoveNext(); Debug.Assert(suggestionMoveNext, "There must be a first suggestion"); word = enumerator.Current; prefix.Insert(0, word); } } else { word = -1; } } } else { word = -1; } return(word); }
public IEnumerable <int> MakePredictions(int count, string startsWith, params int[] prefix) { if (_dictionaryList.Count != 0) { var emitted = new HashSet <int>(); var emittedCount = 0; var plumber = Plumber <int[]> .Create(prefix, GetPrefixDepth, Comparer, _dictionaryList.Count); var sliceEnumerable = plumber.GetDepthSlices(); using (var sliceEnumerator = sliceEnumerable.GetEnumerator()) { if (sliceEnumerator.MoveNext()) { var outerSlice = sliceEnumerator.Current; var suggestions = GetSliceSuggestions(outerSlice.Start, outerSlice.Limit, outerSlice.Limit, outerSlice.Limit); using (var enumerator = suggestions.GetEnumerator()) { while (emittedCount < count && enumerator.MoveNext()) { var word = enumerator.Current; var wordEntry = _wordList[word]; var wordString = wordEntry.Word; if (WordUsesBeforeUsingInSuggestions <= wordEntry.UseCount && wordString.StartsWith(startsWith)) { Debug.Assert(!emitted.Contains(word)); emitted.Add(word); yield return(word); emittedCount++; } } } while (emittedCount < count && sliceEnumerator.MoveNext()) { var innerSlice = outerSlice; outerSlice = sliceEnumerator.Current; suggestions = GetSliceSuggestions(outerSlice.Start, innerSlice.Start, innerSlice.Limit, outerSlice.Limit); using (var enumerator = suggestions.GetEnumerator()) { while (emittedCount < count && enumerator.MoveNext()) { var word = enumerator.Current; var wordEntry = _wordList[word]; var wordString = wordEntry.Word; if (WordUsesBeforeUsingInSuggestions <= wordEntry.UseCount && wordString.StartsWith(startsWith) && !emitted.Contains(word)) { emitted.Add(word); yield return(enumerator.Current); emittedCount++; } } } } } } } }