roan_engine/value/methods/
vec.rs

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
63
64
65
66
67
68
69
70
71
72
use crate::{
    as_cast, native_function,
    value::Value,
    vm::native_fn::{NativeFunction, NativeFunctionParam},
};

native_function!(
    fn __vec_len(vec) {
        let vec = as_cast!(vec, Vec);

        Value::Int(vec.len() as i64)
    }
);

native_function!(
    fn __vec_next(vec) {
        let mut vec = as_cast!(vec, Vec);

        Value::Vec(vec.into_iter().skip(1).collect())
    }
);

native_function!(
    fn __vec_push(vec, value) {
        let mut vec = as_cast!(vec, Vec);
        let value = value;

        vec.push(value);

        Value::Vec(vec)
    }
);

#[cfg(test)]
mod tests {
    use super::*;
    use crate::value::Value;

    #[test]
    fn test_vec_len() {
        let vec = vec![Value::Int(1), Value::Int(2), Value::Int(3)];
        let result = __vec_len().call(vec![Value::Vec(vec.clone())]).unwrap();

        assert_eq!(result, Value::Int(3));
    }

    #[test]
    fn test_vec_next() {
        let vec = vec![Value::Int(1), Value::Int(2), Value::Int(3)];
        let result = __vec_next().call(vec![Value::Vec(vec.clone())]).unwrap();

        assert_eq!(result, Value::Vec(vec![Value::Int(2), Value::Int(3)]));
    }

    #[test]
    fn test_vec_push() {
        let vec = vec![Value::Int(1), Value::Int(2), Value::Int(3)];
        let result = __vec_push()
            .call(vec![Value::Vec(vec.clone()), Value::Int(4)])
            .unwrap();

        assert_eq!(
            result,
            Value::Vec(vec![
                Value::Int(1),
                Value::Int(2),
                Value::Int(3),
                Value::Int(4)
            ])
        );
    }
}