pluralizer 0.5.0

Rust package to pluralize or singularize any word based on a count inspired on pluralize NPM package
Documentation
/// Irregular rules
pub(crate) const IRREGULAR_RULES: &'static [(&str, &str)] = &[
    // Pronouns.
    ("I", "we"),
    ("me", "us"),
    ("he", "they"),
    ("she", "they"),
    ("them", "them"),
    ("myself", "ourselves"),
    ("yourself", "yourselves"),
    ("itself", "themselves"),
    ("herself", "themselves"),
    ("himself", "themselves"),
    ("themself", "themselves"),
    ("is", "are"),
    ("was", "were"),
    ("has", "have"),
    ("this", "these"),
    ("that", "those"),
    ("my", "our"),
    ("its", "their"),
    ("his", "their"),
    ("her", "their"),
    // Words ending in with a consonant and `o`.
    ("echo", "echoes"),
    ("dingo", "dingoes"),
    ("volcano", "volcanoes"),
    ("tornado", "tornadoes"),
    ("torpedo", "torpedoes"),
    // Ends with `us`.
    ("genus", "genera"),
    ("viscus", "viscera"),
    // Ends with `ma`.
    ("stigma", "stigmata"),
    ("stoma", "stomata"),
    ("dogma", "dogmata"),
    ("lemma", "lemmata"),
    ("schema", "schemata"),
    ("anathema", "anathemata"),
    // Other irregular rules.
    ("ox", "oxen"),
    ("axe", "axes"),
    ("die", "dice"),
    ("yes", "yeses"),
    ("foot", "feet"),
    ("eave", "eaves"),
    ("goose", "geese"),
    ("tooth", "teeth"),
    ("quiz", "quizzes"),
    ("human", "humans"),
    ("proof", "proofs"),
    ("carve", "carves"),
    ("valve", "valves"),
    ("looey", "looies"),
    ("thief", "thieves"),
    ("groove", "grooves"),
    ("pickaxe", "pickaxes"),
    ("passerby", "passersby"),
    ("canvas", "canvases"),
];

/// Pluralization rules
pub(crate) const PLURAL_RULES: &'static [(&str, &str)] = &[
    ("(?i)s?$", "s"),
    (r"(?i)[^\u0000-\u007F]$", "$0"),
    (r"(?i)([^aeiou]ese)$", "$1"),
    (r"(?i)(ax|test)is$", "$1es"),
    (r"(?i)(alias|[^aou]us|t[lm]as|gas|ris)$", "$1es"),
    (r"(?i)(e[mn]u)s?$", "$1s"),
    (r"(?i)([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$", "$1"),
    (
        r"(?i)(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$",
        "$1i",
    ),
    (r"(?i)(alumn|alg|vertebr)(?:a|ae)$", "$1ae"),
    (r"(?i)(seraph|cherub)(?:im)?$", "$1im"),
    (r"(?i)(her|at|gr)o$", "$1oes"),
    (
        r"(?i)(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$",
        "$1a",
    ),
    (
        r"(?i)(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$",
        "$1a",
    ),
    (r"(?i)sis$", "ses"),
    (r"(?i)(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$", "$1$2ves"),
    (r"(?i)([^aeiouy]|qu)y$", "$1ies"),
    (r"(?i)([^ch][ieo][ln])ey$", "$1ies"),
    (r"(?i)(x|ch|ss|sh|zz)$", "$1es"),
    (
        r"(?i)(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$",
        "$1ices",
    ),
    (r"(?i)\b((?:tit)?m|l)(?:ice|ouse)$", "$1ice"),
    (r"(?i)(pe)(?:rson|ople)$", "$1ople"),
    (r"(?i)(child)(?:ren)?$", "$1ren"),
    (r"(?i)eaux$", "$0"),
    (r"(?i)m[ae]n$", "men"),
    (r"(?i)^thou$", "you"),
];

/// Singularization rules
pub(crate) const SINGULAR_RULES: &'static [(&str, &str)] = &[
    ("(?i)s$", ""),
    ("(?i)(ss)$", "$1"),
    ("(?i)(wi|kni|(?:after|half|high|low|mid|non|night|[^\\w]|^)li)ves$", "$1fe"),
    ("(?i)(ar|(?:wo|[ae])l|[eo][ao])ves$", "$1f"),
    ("(?i)ies$", "y"),
    ("(?i)(dg|ss|ois|lk|ok|wn|mb|th|ch|ec|oal|is|ck|ix|sser|ts|wb)ies$", "$1ie"),
    ("(?i)\\b(l|(?:neck|cross|hog|aun)?t|coll|faer|food|gen|goon|group|hipp|junk|vegg|(?:pork)?p|charl|calor|cut)ies$", "$1ie"),
    ("(?i)\\b(mon|smil)ies$", "$1ey"),
    ("(?i)\\b((?:tit)?m|l)ice$", "$1ouse"),
    ("(?i)(seraph|cherub)im$", "$1"),
    ("(?i)(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$", "$1"),
    ("(?i)(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$", "$1sis"),
    ("(?i)(movie|twelve|abuse|e[mn]u)s$", "$1"),
    ("(?i)(test)(?:is|es)$", "$1is"),
    ("(?i)(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$", "$1us"),
    ("(?i)(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$", "$1um"),
    ("(?i)(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$", "$1on"),
    ("(?i)(alumn|alg|vertebr)ae$", "$1a"),
    ("(?i)(cod|mur|sil|vert|ind)ices$", "$1ex"),
    ("(?i)(matr|append)ices$", "$1ix"),
    ("(?i)(pe)(rson|ople)$", "$1rson"),
    ("(?i)(child)ren$", "$1"),
    ("(?i)(eau)x?$", "$1"),
    ("(?i)men$", "man"),
];

pub(crate) const UNCOUNTABLE_RULES: &'static [&str] = &[
    // Singular words with no plurals.
    "adulthood",
    "advice",
    "agenda",
    "aid",
    "aircraft",
    "alcohol",
    "ammo",
    "analytics",
    "anime",
    "athletics",
    "audio",
    "bison",
    "blood",
    "bream",
    "buffalo",
    "butter",
    "carp",
    "cash",
    "chassis",
    "chess",
    "clothing",
    "cod",
    "commerce",
    "cooperation",
    "corps",
    "debris",
    "diabetes",
    "digestion",
    "elk",
    "energy",
    "equipment",
    "excretion",
    "expertise",
    "firmware",
    "flounder",
    "fun",
    "gallows",
    "garbage",
    "graffiti",
    "hardware",
    "headquarters",
    "health",
    "herpes",
    "highjinks",
    "homework",
    "housework",
    "information",
    "jeans",
    "justice",
    "kudos",
    "labour",
    "literature",
    "machinery",
    "mackerel",
    "mail",
    "media",
    "mews",
    "moose",
    "music",
    "mud",
    "manga",
    "news",
    "only",
    "personnel",
    "pike",
    "plankton",
    "pliers",
    "police",
    "pollution",
    "premises",
    "rain",
    "research",
    "rice",
    "salmon",
    "scissors",
    "series",
    "sewage",
    "shambles",
    "shrimp",
    "software",
    "staff",
    "swine",
    "tennis",
    "traffic",
    "transportation",
    "trout",
    "tuna",
    "wealth",
    "welfare",
    "whiting",
    "wildebeest",
    "wildlife",
    "you",
];

pub(crate) const UNCOUNTABLE_REGEX_RULES: &'static [&str] = &[
    "(?i)pok[eé]mon$",
    "(?i)[^aeiou]ese$", // "chinese", "japanese"
    "(?i)deer$",        // "deer", "reindeer"
    "(?i)fish$",        // "fish", "blowfish", "angelfish"
    "(?i)measles$",
    "(?i)o[iu]s$", // "carnivorous"
    "(?i)pox$",    // "chickpox", "smallpox"
    "(?i)sheep$",
];