use std::collections::hash_map::Entry;
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use crate::editing::application::ApplicationInfo;
use crate::editing::buffer::EditBuffer;
pub type SharedBuffer<I> = Arc<RwLock<EditBuffer<I>>>;
pub struct BufferStore<I: ApplicationInfo> {
buffers: HashMap<I::ContentId, SharedBuffer<I>>,
}
impl<I> BufferStore<I>
where
I: ApplicationInfo,
{
pub fn new() -> Self {
BufferStore { buffers: HashMap::new() }
}
fn mkbuf(&mut self, id: I::ContentId) -> SharedBuffer<I> {
let buffer = EditBuffer::new(id);
return Arc::new(RwLock::new(buffer));
}
fn mkbufstr(&mut self, s: &str, id: I::ContentId) -> SharedBuffer<I> {
let buffer = EditBuffer::from_str(id, s);
return Arc::new(RwLock::new(buffer));
}
pub fn entry(&mut self, id: I::ContentId) -> Entry<I::ContentId, SharedBuffer<I>> {
self.buffers.entry(id)
}
pub fn load(&mut self, id: I::ContentId) -> SharedBuffer<I> {
if let Some(buffer) = self.buffers.get(&id) {
return buffer.clone();
} else {
let buffer = self.mkbuf(id.clone());
self.buffers.insert(id, buffer.clone());
return buffer;
}
}
pub fn load_str(&mut self, id: I::ContentId, s: &str) -> SharedBuffer<I> {
if let Some(buffer) = self.buffers.get(&id) {
return buffer.clone();
} else {
let buffer = self.mkbufstr(s, id.clone());
self.buffers.insert(id, buffer.clone());
return buffer;
}
}
}
impl<I> Default for BufferStore<I>
where
I: ApplicationInfo,
{
fn default() -> Self {
Self::new()
}
}