chiark / gitweb /
not working
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 Apr 2023 16:10:32 +0000 (17:10 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 20 Apr 2023 16:10:32 +0000 (17:10 +0100)
src/main.rs

index 3b6259cd4466e5fa7a00f37c1f073783a71544cf..966cf04365ccc46db1b05c244349290c15d7a55c 100644 (file)
@@ -3,15 +3,15 @@ use std::sync::*;
 
 pub trait Callable<Args>: Any {
     type Output;
-    fn callable_call(self, a: Args) -> Self::Output;
+    fn curry_fn() -> fn(Self, 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) }
+    fn curry_fn() -> fn(Self, (A,)) -> O { |self_, (a,)| (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) }
+    fn curry_fn() -> fn(Self, (A,B)) -> O { |self_, (a,b)| (self_)(a,b) }
 }
 
 pub trait Object: Any + Send + Sync {}
@@ -20,13 +20,17 @@ 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())
+
+impl<O: Object, F> MI for fn((Arc<O>,())) -> usize {
+    fn call(&self, o: Arc<dyn Any + Send + Sync>, u: ()) -> usize {
+        (self)((Arc::downcast(o).unwrap(), u))
     }
-}*/
+}
+impl<O: Object, F> MI for fn((Arc<O>,)) -> usize {
+    fn call(&self, o: Arc<dyn Any + Send + Sync>, _u: ()) -> usize {
+        (self)((Arc::downcast(o).unwrap(),))
+    }
+}
 
 fn example(o: Arc<String>) -> usize { o.len() }
 
@@ -61,11 +65,13 @@ where C: Fn((O,)) -> usize
 }
 */
 fn main() {
-    const CL: () = {
-        |t| Callable::callable_call(example, t);
-        ()
+    const CL: &dyn Any = {
+        &(
+        (&|t| Callable::curry_fn()(example, t))
+            as fn(_) -> _
+        )
     };
-//example.callable_call();
+//example.curry_fn();
 //    let v: &dyn MI = k(example);
 
     println!("Hello, world!");