1use std::sync::Arc;
2
3use crate::{Resolve, Services};
4
5pub struct Singleton<S> {
6 service: Arc<S>,
7}
8
9impl<S> Singleton<S> {
10 pub fn new(service: S) -> Self {
11 Self {
12 service: Arc::new(service),
13 }
14 }
15}
16
17impl<S, C> Resolve<S, C> for Singleton<S>
18where
19 S: Send + Sync,
20{
21 fn resolve(&self, _container: &C) -> Option<Arc<S>> {
22 Some(Arc::clone(&self.service))
23 }
24}
25
26pub trait SingletonServices: Services {
27 fn singleton<S>(&mut self, service: S)
28 where
29 S: Send + Sync + 'static,
30 {
31 self.put(Singleton::new(service));
32 }
33}
34
35impl<C> SingletonServices for C where C: Services {}