use std::sync::{atomic::AtomicU64, RwLock};
use serde::{Deserialize, Serialize};
use crate::{equation::TypeVar, GenericLists, HashMap};
#[derive(Serialize, Deserialize)]
pub struct SharedTypeStateInner {
generic_lists: GenericLists,
type_vars: Vec<TypeVar>,
}
#[derive(Serialize, Deserialize)]
pub struct SharedTypeState {
inner: RwLock<SharedTypeStateInner>,
pub next_typeid: AtomicU64,
pub next_annon_generic_list: AtomicU64,
}
impl SharedTypeState {
pub fn new() -> Self {
Self {
inner: RwLock::new(SharedTypeStateInner {
generic_lists: HashMap::new(),
type_vars: vec![],
}),
next_typeid: AtomicU64::new(0),
next_annon_generic_list: AtomicU64::new(0),
}
}
pub fn modify_type_vars<T, F: FnOnce(&mut Vec<TypeVar>) -> T>(&self, f: F) -> T {
(f)(&mut self.inner.write().unwrap().type_vars)
}
pub fn read_type_vars<T, F: FnOnce(&Vec<TypeVar>) -> T>(&self, f: F) -> T {
(f)(&self.inner.read().unwrap().type_vars)
}
pub fn modify_generic_lists<T, F: FnOnce(&mut GenericLists) -> T>(&self, f: F) -> T {
(f)(&mut self.inner.write().unwrap().generic_lists)
}
pub fn read_generic_lists<T, F: FnOnce(&GenericLists) -> T>(&self, f: F) -> T {
(f)(&self.inner.read().unwrap().generic_lists)
}
}