+use std::any::*;
+use std::sync::*;
-mod private_outer {
- mod private_inner_ref {
- /// Consumes a `crate::private_outer::private_inner_def::Item`.
- fn t(_: crate::private_outer::private_inner_def::Item) { }
+pub trait Object: Any + Send + Sync {}
+impl Object for String {}
+pub trait MI {
+ fn o_ti(&self) -> TypeId;
+ fn call(&self, o: Arc<dyn Any + Send + Sync>) -> usize;
+}
+impl<O: Object> MI for fn(Arc<O>) -> usize {
+ fn o_ti(&self) -> TypeId { TypeId::of::<O>() }
+ fn call(&self, o: Arc<dyn Any + Send + Sync>) -> usize {
+ (self)(Arc::downcast(o).unwrap())
}
+}
- pub(super) mod private_inner_def {
- pub(super) struct Item;
- }
+fn example(o: Arc<String>) -> usize { o.len() }
+
+const fn k<O: Object, F: Call<O>>(f: &F) -> &dyn MI + '_ {
+ move |o| f(o)
+ /*
+ struct TE(&F);
+ impl MI for TE {
+ fn o_ti(&self) -> TypeId { TypeId::of::<O>() }
+ fn call(&self, o: Arc<dyn Any + Send + Sync>) -> usize {
+
+ }
+ }*/
+
+}
+
+fn main() {
+ let v: &dyn MI = k(&example);
+
+ println!("Hello, world!");
}