chiark / gitweb /
fromk play
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 Apr 2023 15:20:06 +0000 (16:20 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 Apr 2023 15:20:06 +0000 (16:20 +0100)
src/main.rs

index 8525d778089475eff11e3257394ebab6b92e7ce8..9860f7015146267b8e3c30221be9a2963cf65343 100644 (file)
@@ -1,11 +1,36 @@
+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!");
 }