nanvm_lib/vm/internal/
icontainer.rs1use core::fmt::Debug;
2
3use crate::{common::sized_index::SizedIndex, vm::IVm};
4
5use super::IComplex;
6
7pub trait IContainer<A: IVm>: IComplex<A> {
9 type Header: PartialEq + Clone;
11 type Item: Debug + Clone;
12 type Items: ?Sized + SizedIndex<usize, Output = Self::Item>;
13
14 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 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}