Skip to main content

nanvm_lib/vm/internal/
icontainer.rs

1use core::fmt::Debug;
2
3use crate::{common::sized_index::SizedIndex, vm::IVm};
4
5use super::IComplex;
6
7/// A sequence with a header: a string, a bigint, an array, an object.
8pub trait IContainer<A: IVm>: IComplex<A> {
9    // types
10    type Header: PartialEq + Clone;
11    type Item: Debug + Clone;
12    type Items: ?Sized + SizedIndex<usize, Output = Self::Item>;
13
14    // functions
15    fn new<E>(
16        header: Self::Header,
17        i: impl IntoIterator<Item = Result<Self::Item, E>>,
18    ) -> Result<Self, E>;
19    fn header(&self) -> &Self::Header;
20    fn items(&self) -> &Self::Items;
21
22    // extensions
23
24    fn new_ok(header: Self::Header, i: impl IntoIterator<Item = Self::Item>) -> Self {
25        Self::new::<()>(header, i.into_iter().map(Ok)).unwrap()
26    }
27
28    fn items_eq(&self, b: &Self) -> bool
29    where
30        Self::Header: PartialEq,
31        Self::Item: PartialEq,
32    {
33        if self.header() != b.header() {
34            return false;
35        }
36        let a = self.items();
37        let b = b.items();
38        let len = a.length();
39        if len != b.length() {
40            return false;
41        }
42        for i in 0..len {
43            if a[i] != b[i] {
44                return false;
45            }
46        }
47        true
48    }
49}