use borrows for hints
This commit is contained in:
parent
3df2c166b1
commit
3521ff3a13
@ -58,7 +58,7 @@ pub struct FunctionEntry {
|
|||||||
extrema_data: Vec<Value>,
|
extrema_data: Vec<Value>,
|
||||||
roots_data: Vec<Value>,
|
roots_data: Vec<Value>,
|
||||||
|
|
||||||
autocomplete: AutoComplete,
|
autocomplete: AutoComplete<'static>,
|
||||||
|
|
||||||
test_result: Option<String>,
|
test_result: Option<String>,
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
use crate::misc::chars_take;
|
use crate::misc::chars_take;
|
||||||
|
|
||||||
|
const HINTENUM_EMPTY: HintEnum = HintEnum::Single("x^2");
|
||||||
|
const HINTENUM_CLOSED_PARENS: HintEnum = HintEnum::Single(")");
|
||||||
|
|
||||||
/// Generate a hint based on the input `input`, returns an `Option<String>`
|
/// Generate a hint based on the input `input`, returns an `Option<String>`
|
||||||
pub fn generate_hint(input: &str) -> HintEnum<'static> {
|
pub fn generate_hint<'a>(input: &str) -> &'a HintEnum<'a> {
|
||||||
if input.is_empty() {
|
if input.is_empty() {
|
||||||
return HintEnum::Single("x^2");
|
return &HINTENUM_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
let chars: Vec<char> = input.chars().collect::<Vec<char>>();
|
let chars: Vec<char> = input.chars().collect::<Vec<char>>();
|
||||||
@ -17,18 +20,23 @@ pub fn generate_hint(input: &str) -> HintEnum<'static> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if open_parens > closed_parens {
|
if open_parens > closed_parens {
|
||||||
return HintEnum::Single(")");
|
return &HINTENUM_CLOSED_PARENS;
|
||||||
}
|
}
|
||||||
|
|
||||||
let len = chars.len();
|
let len = chars.len();
|
||||||
|
|
||||||
for i in (1..=MAX_COMPLETION_LEN).rev().filter(|i| len >= *i) {
|
for key in (1..=MAX_COMPLETION_LEN)
|
||||||
if let Some(output) = get_completion(&chars_take(&chars, i)) {
|
.rev()
|
||||||
return output.clone();
|
.filter(|i| len >= *i)
|
||||||
|
.map(|i| chars_take(&chars, i))
|
||||||
|
.filter(|cut_string| !cut_string.is_empty())
|
||||||
|
{
|
||||||
|
if let Some(output) = COMPLETION_HASHMAP.get(&key) {
|
||||||
|
return output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HintEnum::None
|
&HintEnum::None
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq)]
|
#[derive(Clone, PartialEq)]
|
||||||
@ -66,17 +74,6 @@ impl HintEnum<'static> {
|
|||||||
|
|
||||||
include!(concat!(env!("OUT_DIR"), "/codegen.rs"));
|
include!(concat!(env!("OUT_DIR"), "/codegen.rs"));
|
||||||
|
|
||||||
/// Gets completion from `COMPLETION_HASHMAP`
|
|
||||||
pub fn get_completion(key: &str) -> Option<&HintEnum<'static>> {
|
|
||||||
// If key is empty, just return None
|
|
||||||
if key.is_empty() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get and clone the recieved data
|
|
||||||
COMPLETION_HASHMAP.get(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@ -97,7 +94,7 @@ mod tests {
|
|||||||
|
|
||||||
for (key, value) in values {
|
for (key, value) in values {
|
||||||
println!("{} + {:?}", key, value);
|
println!("{} + {:?}", key, value);
|
||||||
assert_eq!(generate_hint(key), value);
|
assert_eq!(generate_hint(key), &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -4,25 +4,25 @@ use egui::{text::CCursor, text_edit::CursorRange, Key, Modifiers, TextEdit, Widg
|
|||||||
use epaint::text::cursor::{Cursor, PCursor, RCursor};
|
use epaint::text::cursor::{Cursor, PCursor, RCursor};
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct AutoComplete {
|
pub struct AutoComplete<'a> {
|
||||||
pub i: usize,
|
pub i: usize,
|
||||||
pub hint: HintEnum<'static>,
|
pub hint: &'a HintEnum<'static>,
|
||||||
pub func_str: Option<String>,
|
pub func_str: Option<String>,
|
||||||
pub changed: bool,
|
pub changed: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for AutoComplete {
|
impl Default for AutoComplete<'static> {
|
||||||
fn default() -> AutoComplete {
|
fn default() -> AutoComplete<'static> {
|
||||||
AutoComplete {
|
AutoComplete {
|
||||||
i: 0,
|
i: 0,
|
||||||
hint: HintEnum::None,
|
hint: &HintEnum::None,
|
||||||
func_str: None,
|
func_str: None,
|
||||||
changed: true,
|
changed: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AutoComplete {
|
impl<'a> AutoComplete<'a> {
|
||||||
fn changed(&mut self, string: &str) {
|
fn changed(&mut self, string: &str) {
|
||||||
if self.func_str != Some(string.to_string()) {
|
if self.func_str != Some(string.to_string()) {
|
||||||
self.changed = true;
|
self.changed = true;
|
||||||
@ -57,7 +57,7 @@ impl AutoComplete {
|
|||||||
|
|
||||||
if let HintEnum::Single(single_hint) = self.hint {
|
if let HintEnum::Single(single_hint) = self.hint {
|
||||||
let func_edit_2 = func_edit;
|
let func_edit_2 = func_edit;
|
||||||
func_edit = func_edit_2.hint_text(single_hint);
|
func_edit = func_edit_2.hint_text(*single_hint);
|
||||||
}
|
}
|
||||||
|
|
||||||
let re = func_edit.id(te_id).ui(ui);
|
let re = func_edit.id(te_id).ui(ui);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user