about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-07-27T18·58+0300
committertazjin <tazjin@tvl.su>2022-07-27T21·54+0000
commit67b7668e85dfcab4fadcab2fc42baba969f7df9e (patch)
tree600fa61fa3192d669277e33a03efd83eaf161b07
parent7b217bbbe1489840f015411c53d3b31401556b40 (diff)
refactor(predlozhnik): use BTreeSet's for the ... sets r/4327
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 <tazjin@tvl.su>
-rw-r--r--users/tazjin/predlozhnik/src/main.rs97
1 files changed, 49 insertions, 48 deletions
diff --git a/users/tazjin/predlozhnik/src/main.rs b/users/tazjin/predlozhnik/src/main.rs
index bc4df15466..f2e46da48f 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<Html>,
 }
 
@@ -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,
         },
     }