1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! # Anonymous Native (Rust) method with a defined arity
//!
//! This is a Method and so use an object as first argument.
//! The method is linked with the `Object`'s `Class` say their protocols.
//!
//! Method can be with multi-arity according to SFunction.multiarity.
//! If this value is Nil, no multi-arity, else the value is the arity
//! of the multi-arity function, which should be the last one.

use std::fmt::*;

use clojure::rust::*;
// use clojure::lang::*;
use intertrait::*;

use crate::*;
castable_to!(SFnMethodNative => [sync] IObject, FnMethodNative);

pub struct SFnMethodNative {
    inner: fn(&[Object]) -> ObjResult<Object>,
}

impl Debug for SFnMethodNative {
    fn fmt(
        &self,
        f: &mut Formatter<'_>,
    ) -> Result {
        write!(f, "Method native")
    }
}

pub trait FnMethodNative: IObject {
    fn call(
        &self,
        args: &[Object],
    ) -> ObjResult<Object>;
}

impl FnMethodNative for SFnMethodNative {
    fn call(
        &self,
        args: &[Object],
    ) -> ObjResult<Object> {
        let f = self.inner;
        f(args)
    }
}

impl IObject for SFnMethodNative {
    fn getClass<'a>(&self) -> &'a SClass { todo!() }

    fn hashCode(&self) -> usize { todo!() }

    fn equals(
        &self,
        other: &Object,
    ) -> bool {
        todo!()
    }

    fn toString(&self) -> String { todo!() }
}