public static WordList CreateFromWords(IEnumerable <string> words, AffixConfig affix) { var wordListBuilder = new Builder(affix ?? new AffixConfig.Builder().MoveToImmutable()); if (words is IList <string> wordsAsList) { wordListBuilder.InitializeEntriesByRoot(wordsAsList.Count); } else { wordListBuilder.InitializeEntriesByRoot(0); } foreach (var word in words) { var wordEntry = new WordEntry(word, FlagSet.Empty, MorphSet.Empty, WordEntryOptions.None); WordEntrySet entryList = !wordListBuilder.EntriesByRoot.TryGetValue(word, out entryList) ? WordEntrySet.Create(wordEntry) : WordEntrySet.CopyWithItemAdded(entryList, wordEntry); wordListBuilder.EntriesByRoot.Add(word, entryList); } return(wordListBuilder.MoveToImmutable()); }
public static WordEntrySet CopyWithItemReplaced(WordEntrySet source, int index, WordEntry replacement) { var newEntries = new WordEntry[source.items.Length]; Array.Copy(source.items, newEntries, newEntries.Length); newEntries[index] = replacement; return(TakeArray(newEntries)); }
public static WordEntrySet CopyWithItemAdded(WordEntrySet source, WordEntry entry) { WordEntry[] newEntries; if (source.items.Length == 0) { newEntries = new[] { entry }; } else { newEntries = new WordEntry[source.items.Length + 1]; Array.Copy(source.items, newEntries, source.items.Length); newEntries[source.items.Length] = entry; } return(TakeArray(newEntries)); }
private bool AddWord(string word, FlagSet flags, MorphSet morphs, bool onlyUpperCase) { if (Affix.IgnoredChars.HasItems) { word = word.RemoveChars(Affix.IgnoredChars); } if (Affix.ComplexPrefixes) { word = word.Reverse(); if (morphs.HasItems && !Affix.IsAliasM) { var newMorphs = new string[morphs.Count]; for (int i = 0; i < morphs.Count; i++) { newMorphs[i] = morphs[morphs.Count - i - 1].Reverse(); } morphs = MorphSet.TakeArray(newMorphs); } } WordEntryOptions options; if (morphs.HasItems) { if (Affix.IsAliasM) { options = WordEntryOptions.AliasM; var morphBuilder = new List <string>(); foreach (var originalValue in morphs) { if (IntEx.TryParseInvariant(originalValue, out int morphNumber) && Affix.TryGetAliasM(morphNumber, out MorphSet aliasedMorph)) { morphBuilder.AddRange(aliasedMorph); } else { morphBuilder.Add(originalValue); } } morphs = MorphSet.Create(morphBuilder); } else { options = WordEntryOptions.None; } if (morphs.AnyStartsWith(MorphologicalTags.Phon)) { options |= WordEntryOptions.Phon; } } else { options = WordEntryOptions.None; } bool saveEntryList = false; word = Builder.Dedup(word); if (!Builder.EntriesByRoot.TryGetValue(word, out WordEntrySet entryList)) { saveEntryList = true; entryList = WordEntrySet.Empty; } var upperCaseHomonym = false; for (var i = 0; i < entryList.Count; i++) { var existingEntry = entryList[i]; if (!onlyUpperCase) { if (existingEntry.ContainsFlag(SpecialFlags.OnlyUpcaseFlag)) { existingEntry = new WordEntry( existingEntry.Word, flags, existingEntry.Morphs, existingEntry.Options); entryList.DestructiveReplace(i, existingEntry); return(false); } } else { upperCaseHomonym = true; } } if (!upperCaseHomonym) { saveEntryList = true; entryList = WordEntrySet.CopyWithItemAdded(entryList, new WordEntry( word, flags, Builder.Dedup(morphs), options)); } if (saveEntryList) { Builder.EntriesByRoot[word] = entryList; } return(false); }