1use std::{any::Any, borrow::Cow, hash::Hash};
2
3pub trait AsAny {
4 fn as_any(&self) -> &dyn Any;
5 fn as_any_mut(&mut self) -> &mut dyn Any;
6}
7
8impl<T: Any> AsAny for T {
9 fn as_any(&self) -> &dyn Any {
10 self
11 }
12 fn as_any_mut(&mut self) -> &mut dyn Any {
13 self
14 }
15}
16
17pub trait IntoAny {
18 fn into_any(self: Box<Self>) -> Box<dyn Any>;
19}
20
21impl<T: Any> IntoAny for T {
22 fn into_any(self: Box<Self>) -> Box<dyn Any> {
23 self
24 }
25}
26
27pub trait DynHash {
28 fn dyn_hash(&self, state: &mut dyn std::hash::Hasher);
29}
30
31impl<T: Hash> DynHash for T {
32 fn dyn_hash(&self, mut state: &mut dyn std::hash::Hasher) {
33 self.hash(&mut state);
34 }
35}
36
37pub trait DynEq {
38 fn dyn_eq(&self, other: &dyn Any) -> bool;
39}
40
41impl<T: Eq + Any> DynEq for T {
42 fn dyn_eq(&self, other: &dyn Any) -> bool {
43 if let Some(module) = other.downcast_ref::<T>() {
44 self == module
45 } else {
46 false
47 }
48 }
49}
50
51pub trait CowExt<'a, T>
52where
53 T: ToOwned + ?Sized + 'a,
54{
55 fn map<R>(self, f: impl FnOnce(&T) -> Cow<R>) -> Cow<'a, R>
56 where
57 R: ToOwned + ?Sized;
58}
59
60impl<'a, T> CowExt<'a, T> for Cow<'a, T>
61where
62 T: ToOwned + ?Sized + 'a,
63{
64 fn map<R>(self, f: impl FnOnce(&T) -> Cow<R>) -> Cow<'a, R>
65 where
66 R: ToOwned + ?Sized,
67 {
68 use std::borrow::Borrow;
69 match self {
70 Cow::Borrowed(borrowed) => f(borrowed),
71 Cow::Owned(owned) => {
72 let result = f(owned.borrow());
73 Cow::Owned(result.into_owned())
74 }
75 }
76 }
77}