From 67b7668e85dfcab4fadcab2fc42baba969f7df9e Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 27 Jul 2022 21:58:17 +0300 Subject: refactor(predlozhnik): use BTreeSet's for the ... sets The stable ordering guarantee will make the output a lot nicer (and more stable). Change-Id: I7edd1abb0805e948bc41fe5bc111b3cb54592aac Reviewed-on: https://cl.tvl.fyi/c/depot/+/5982 Tested-by: BuildkiteCI Reviewed-by: tazjin --- users/tazjin/predlozhnik/src/main.rs | 97 ++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/users/tazjin/predlozhnik/src/main.rs b/users/tazjin/predlozhnik/src/main.rs index bc4df154662a..f2e46da48f4c 100644 --- a/users/tazjin/predlozhnik/src/main.rs +++ b/users/tazjin/predlozhnik/src/main.rs @@ -2,10 +2,11 @@ use yew::prelude::*; use lazy_static::lazy_static; use maplit::hashmap; +use std::collections::BTreeSet; use std::collections::HashMap; use std::fmt::Write; -#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)] enum Падеж { Именительный, Родительный, @@ -39,55 +40,55 @@ impl Падеж { } lazy_static! { - static ref ПО_ПРЕДЛОГУ: HashMap<&'static str, Vec<Падеж>> = { + static ref ПО_ПРЕДЛОГУ: HashMap<&'static str, BTreeSet<Падеж>> = { use Падеж::*; hashmap! { - "без" => vec![Родительный], - "близ" => vec![Родительный], - "в" => vec![Винительный, Предложный], - "вместо" => vec![Родительный], - "вне" => vec![Родительный], - "возле" => vec![Родительный], - "вокруг" => vec![Родительный], - "вроде" => vec![Родительный], - "для" => vec![Родительный], - "до" => vec![Родительный], - "за" => vec![Винительный, Творительный], - "из" => vec![Родительный], - "из-за" => vec![Родительный], - "из-под" => vec![Родительный], - "к" => vec![Дательный], - "кроме" => vec![Родительный], - "между" => vec![Творительный, Родительный], - "на" => vec![Винительный, Предложный], - "над" => vec![Творительный], - "нет" => vec![Именительный], - "о" => vec![Винительный], - "обо" => vec![Винительный], - "около" => vec![Родительный], - "от" => vec![Родительный], - "перед" => vec![Творительный], - "по" => vec![Винительный, Дательный, Предложный], - "под" => vec![Винительный, Творительный], - "при" => vec![Предложный], - "про" => vec![Винительный], - "ради" => vec![Родительный], - "с" => vec![Родительный, Винительный, Творительный], - "сквозь" => vec![Винительный], - "среди" => vec![Родительный], - "у" => vec![Родительный], - "через" => vec![Винительный], + "без" => BTreeSet::from([Родительный]), + "близ" => BTreeSet::from([Родительный]), + "в" => BTreeSet::from([Винительный, Предложный]), + "вместо" => BTreeSet::from([Родительный]), + "вне" => BTreeSet::from([Родительный]), + "возле" => BTreeSet::from([Родительный]), + "вокруг" => BTreeSet::from([Родительный]), + "вроде" => BTreeSet::from([Родительный]), + "для" => BTreeSet::from([Родительный]), + "до" => BTreeSet::from([Родительный]), + "за" => BTreeSet::from([Винительный, Творительный]), + "из" => BTreeSet::from([Родительный]), + "из-за" => BTreeSet::from([Родительный]), + "из-под" => BTreeSet::from([Родительный]), + "к" => BTreeSet::from([Дательный]), + "кроме" => BTreeSet::from([Родительный]), + "между" => BTreeSet::from([Творительный, Родительный]), + "на" => BTreeSet::from([Винительный, Предложный]), + "над" => BTreeSet::from([Творительный]), + "нет" => BTreeSet::from([Именительный]), + "о" => BTreeSet::from([Винительный]), + "обо" => BTreeSet::from([Винительный]), + "около" => BTreeSet::from([Родительный]), + "от" => BTreeSet::from([Родительный]), + "перед" => BTreeSet::from([Творительный]), + "по" => BTreeSet::from([Винительный, Дательный, Предложный]), + "под" => BTreeSet::from([Винительный, Творительный]), + "при" => BTreeSet::from([Предложный]), + "про" => BTreeSet::from([Винительный]), + "ради" => BTreeSet::from([Родительный]), + "с" => BTreeSet::from([Родительный, Винительный, Творительный]), + "сквозь" => BTreeSet::from([Винительный]), + "среди" => BTreeSet::from([Родительный]), + "у" => BTreeSet::from([Родительный]), + "через" => BTreeSet::from([Винительный]), } }; - static ref ПО_ПАДЕЖУ: HashMap<Падеж, Vec<&'static str>> = { + static ref ПО_ПАДЕЖУ: HashMap<Падеж, BTreeSet<&'static str>> = { let mut m = hashmap!(); for c in Падеж::ВСЕ { - let mut предлоги: Vec<&'static str> = vec![]; + let mut предлоги: BTreeSet<&'static str> = BTreeSet::new(); for (k, v) in &*ПО_ПРЕДЛОГУ { if v.contains(&c) { - предлоги.push(k); + предлоги.insert(k); } } @@ -123,8 +124,8 @@ struct Модель { } struct Вывод { - доступные_падежи: Vec<Падеж>, - доступные_предлоги: Vec<&'static str>, + доступные_падежи: BTreeSet<Падеж>, + доступные_предлоги: BTreeSet<&'static str>, объяснение: Option, } @@ -137,26 +138,26 @@ fn объяснить(падеж: Падеж, предлог: &str) -> Html { fn ограничить(м: &Модель) -> Вывод { match (м.падеж, &м.предлог) { (Some(пж), Some(пл)) => Вывод { - доступные_падежи: vec![пж], - доступные_предлоги: vec![пл], + доступные_падежи: BTreeSet::from([пж]), + доступные_предлоги: BTreeSet::from([*пл]), объяснение: Some(объяснить(пж, пл)), }, (Some(пж), None) => Вывод { - доступные_падежи: vec![пж], + доступные_падежи: BTreeSet::from([пж]), доступные_предлоги: (*ПО_ПАДЕЖУ)[&пж].clone(), объяснение: None, }, (None, Some(пл)) => Вывод { доступные_падежи: (*ПО_ПРЕДЛОГУ)[пл].clone(), - доступные_предлоги: vec![пл], + доступные_предлоги: BTreeSet::from([*пл]), объяснение: None, }, (None, None) => Вывод { - доступные_падежи: vec![], - доступные_предлоги: vec![], + доступные_падежи: BTreeSet::new(), + доступные_предлоги: BTreeSet::new(), объяснение: None, }, } -- cgit 1.4.1