loalang 0.1.15

Loa is a general-purpose, purely immutable, object-oriented programming language.
Documentation
extern crate ngrammatic;

use self::ngrammatic::{CorpusBuilder, Pad, SearchResult};
use crate::HashMap;

pub trait RelevanceSearch<T> {
    fn sort_by_relevance(&mut self, by: T);
}

impl<T> RelevanceSearch<&str> for Vec<(String, T)> {
    fn sort_by_relevance(&mut self, by: &str) {
        let mut corpus = CorpusBuilder::new().arity(2).pad_full(Pad::Auto).finish();

        for (s, _) in self.iter() {
            corpus.add_text(s.as_str());
        }

        let mut all_items: HashMap<String, T> =
            std::mem::replace(self, vec![]).into_iter().collect();

        for SearchResult { text, .. } in corpus.search(by, 0f32) {
            if let Some(item) = all_items.remove(&text) {
                self.push((text, item));
            }
        }

        self.extend(all_items.into_iter());
    }
}