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 {}
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() }
}
*/
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!");