/// <summary> /// Fluent (returns itself), add a lexica to the sentence, sentence logic applies here /// </summary> /// <param name="lex"></param> /// <returns></returns> public ILexicalSentence AddEvent(ISensoryEvent lex, bool recursive = true) { lex.Event.Context.Language = Language; //Contractive rules IDictata lexDict = lex.Event.GetDictata(); foreach (IContractionRule contractionRule in Language.ContractionRules.Where(rul => rul.First == lexDict || rul.Second == lexDict)) { if (!lex.Event.Modifiers.Any(mod => contractionRule.First.Equals(mod.GetDictata()) || contractionRule.Second.Equals(mod.GetDictata()))) { continue; } lex.Event.Modifiers.RemoveWhere(mod => contractionRule.First.Equals(mod.GetDictata()) || contractionRule.Second.Equals(mod.GetDictata())); lex.Event.Phrase = contractionRule.Contraction.Name; } //Sentence placement rules SentenceGrammarRule rule = Language.SentenceRules.FirstOrDefault(rul => rul.Type == Type && rul.Fragment == lex.Event.Role); if (rule != null) { //subject if (rule.SubjectPredicate) { Subject.Add(new Tuple <ISensoryEvent, short>(lex, rule.ModificationOrder)); } else { Predicate.Add(new Tuple <ISensoryEvent, short>(lex, rule.ModificationOrder)); } } else { Modifiers.Add(new Tuple <ISensoryEvent, short>(lex, 99)); } if (recursive) { HashSet <ILexica> newMods = new HashSet <ILexica>(); foreach (ILexica mod in lex.Event.Modifiers.Where(mod => mod.Role != GrammaticalType.None && mod.Role != GrammaticalType.Descriptive)) { AddEvent(new SensoryEvent(mod, lex.Strength, lex.SensoryType)); newMods.Add(mod); } lex.Event.Modifiers.RemoveWhere(modi => newMods.Any(mods => mods.Equals(modi))); } return(this); }