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 <tazjin@tvl.su>
This commit is contained in:
parent
7b217bbbe1
commit
67b7668e85
1 changed files with 49 additions and 48 deletions
|
@ -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,
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue