rspack_util/
ext.rs

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}