use std::cell::RefCell;
use std::ops::{Deref, DerefMut};
use std::rc::{Rc, Weak};
pub struct HookData<T> {
pub value: Option<T>,
}
pub type HookType<T> = (Weak<RefCell<HookData<T>>>, Box<dyn Fn(T)>);
pub fn create_hooks_str(init: Option<String>) -> HookType<String> {
let content = Rc::new(RefCell::new(HookData { value: init }));
let weak_ref = Rc::downgrade(&content);
let change: Box<dyn Fn(String)> = Box::new(move |txt: String| {
let value_now = content.deref().borrow().deref().value.clone();
content.borrow_mut().deref_mut().value =
Some(value_now.unwrap_or_else(|| "".to_string()) + txt.as_str());
});
(weak_ref, change)
}