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
use crate::eval::Env;
use crate::objects::{Eval, Object, Vtable};

pub fn class_vtable() -> Vtable {
    Vtable::new("class Time")
}

pub fn instance_vtable() -> Vtable {
    let vt = Vtable::new("Time");
    vt.add_primitive_method_or_panic("addTime:", time_add_time);
    vt.add_primitive_method_or_panic("subTime:", time_sub_time);
    vt.add_primitive_method_or_panic("real", time_real);
    vt.add_primitive_method_or_panic("system", time_system);
    vt.add_primitive_method_or_panic("user", time_user);
    vt
}

fn time_sub_time(receiver: &Object, args: &[Object], env: &Env) -> Eval {
    let res = **args[0].time() - **receiver.time();
    Ok(env.foo.make_time(res))
}

fn time_add_time(receiver: &Object, args: &[Object], env: &Env) -> Eval {
    let res = **args[0].time() + **receiver.time();
    Ok(env.foo.make_time(res))
}

fn time_real(receiver: &Object, _args: &[Object], env: &Env) -> Eval {
    Ok(env.foo.make_float(receiver.time().real))
}

fn time_system(receiver: &Object, _args: &[Object], env: &Env) -> Eval {
    Ok(env.foo.make_float(receiver.time().system))
}

fn time_user(receiver: &Object, _args: &[Object], env: &Env) -> Eval {
    Ok(env.foo.make_float(receiver.time().user))
}