diff --git a/crates/yakui-core/Cargo.toml b/crates/yakui-core/Cargo.toml index 687208df..7e27d005 100644 --- a/crates/yakui-core/Cargo.toml +++ b/crates/yakui-core/Cargo.toml @@ -9,7 +9,6 @@ edition = "2021" [features] [dependencies] -anymap = "0.12.1" bitflags = "2.4.2" fast-srgb8 = "1.0.0" keyboard-types = { version = "0.8.0", default-features = false } diff --git a/crates/yakui-core/src/anymap.rs b/crates/yakui-core/src/anymap.rs new file mode 100644 index 00000000..94d34394 --- /dev/null +++ b/crates/yakui-core/src/anymap.rs @@ -0,0 +1,37 @@ +//! We have anymap at home +use std::{ + any::{Any, TypeId}, + collections::{ + hash_map::{OccupiedEntry, VacantEntry}, + HashMap, + }, +}; + +pub struct AnyMap(HashMap>); + +impl AnyMap { + pub fn new() -> Self { + Self(HashMap::new()) + } + + pub fn entry(&'_ mut self) -> Entry<'_> { + match self.0.entry(TypeId::of::()) { + std::collections::hash_map::Entry::Vacant(v) => Entry::Vacant(v), + std::collections::hash_map::Entry::Occupied(v) => Entry::Occupied(v), + } + } +} + +pub enum Entry<'a> { + Vacant(VacantEntry<'a, TypeId, Box>), + Occupied(OccupiedEntry<'a, TypeId, Box>), +} + +impl<'a> Entry<'a> { + pub fn or_insert_with(self, f: impl FnOnce() -> T) -> &'a mut T { + match self { + Entry::Vacant(v) => v.insert(Box::new(f())).downcast_mut::().unwrap(), + Entry::Occupied(o) => o.into_mut().downcast_mut::().unwrap(), + } + } +} diff --git a/crates/yakui-core/src/dom/mod.rs b/crates/yakui-core/src/dom/mod.rs index 9527a98a..02592748 100644 --- a/crates/yakui-core/src/dom/mod.rs +++ b/crates/yakui-core/src/dom/mod.rs @@ -13,9 +13,9 @@ use std::mem::replace; use std::panic::Location; use std::rc::Rc; -use anymap::AnyMap; use thunderdome::Arena; +use crate::anymap::AnyMap; use crate::id::WidgetId; use crate::input::InputState; use crate::response::Response; diff --git a/crates/yakui-core/src/lib.rs b/crates/yakui-core/src/lib.rs index 42bd3de8..693ba116 100644 --- a/crates/yakui-core/src/lib.rs +++ b/crates/yakui-core/src/lib.rs @@ -6,6 +6,7 @@ #![deny(missing_docs)] #![doc = include_str!("../README.md")] +mod anymap; mod id; mod response; mod state;