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

index 9860f7015146267b8e3c30221be9a2963cf65343..3b6259cd4466e5fa7a00f37c1f073783a71544cf 100644 (file)
@@ -1,36 +1,72 @@
 use std::any::*;
 use std::sync::*;
 
+pub trait Callable<Args>: Any {
+    type Output;
+    fn callable_call(self, a: Args) -> Self::Output;
+}
+impl<A, F, O> Callable<(A,)> for F where F: Fn(A) -> O + 'static {
+    type Output = O;
+    fn callable_call(self, (a,): (A,)) -> O { (self)(a) }
+}
+impl<A,B, F, O> Callable<(A,B)> for F where F: Fn(A,B) -> O + 'static {
+    type Output = O;
+    fn callable_call(self, (a,b): (A,B)) -> O { (self)(a,b) }
+}
+
 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;
+pub trait MI: Any {
+    fn o_ti(&self) -> TypeId { TypeId::of::<Self>() }
+    fn call(&self, o: Arc<dyn Any + Send + Sync>, u: ()) -> 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())
     }
-}
+}*/
 
 fn example(o: Arc<String>) -> usize { o.len() }
 
-const fn k<O: Object, F: Call<O>>(f: &F) -> &dyn MI + '_ {
+/*
+struct K<F>(F);
+
+const fn k<A, F: Callable<A>>(f: F) -> K<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 {
             
         }
-    }*/
+    }
 
 }
+ */
+/*
+struct Thunk<C>(C);
 
+impl<O, C> MI for Thunk<C>
+where C: Fn((O,)) -> usize
+{
+    fn call(&self, o: Arc<dyn Any + Send + Sync>, u: ()) -> usize {
+        (self)((Arc::downcast(o).unwrap(),))
+    }
+}
+*/
 fn main() {
-    let v: &dyn MI = k(&example);
+    const CL: () = {
+        |t| Callable::callable_call(example, t);
+        ()
+    };
+//example.callable_call();
+//    let v: &dyn MI = k(example);
 
     println!("Hello, world!");
 }