/// <summary> /// Returns a NameGender value indicating the likely gender of the Pronoun based on its /// referent if known, or else its PronounKind. /// </summary> /// <param name="referencer">The Pronoun whose gender to lookup.</param> /// <returns>A NameGender value indicating the likely gender of the Pronoun.</returns> private static Gender GetGender(IReferencer referencer) => referencer.Match() .Case((PronounPhrase p) => DeterminePronounPhraseGender(p)) .When(referencer.RefersTo != null) .Then((from referrenced in referencer.RefersTo let gender = referrenced.Match() .Case((NounPhrase n) => DetermineNounPhraseGender(n)) .Case((Pronoun r) => r.Gender) .Case((ProperSingularNoun r) => r.Gender) .Case((CommonNoun n) => Gender.Neutral) .Result() group gender by gender into byGender where byGender.Count() == referencer.RefersTo.Count() select byGender.Key).FirstOrDefault()) .Case((ISimpleGendered p) => p.Gender) .Result();