flux_core/iter/traits/
iterator.rs1use flux_attrs::*;
2
3defs! {
4 fn default_iterator_size<T>(self: T) -> int;
5 fn default_iterator_done<T>(self: T) -> bool;
6 fn max(a: int, b: int) -> int { if a > b { a } else { b } }
7}
8
9#[extern_spec(core::iter)]
10#[assoc(
11 fn valid_item(self: Self, item: Self::Item) -> bool { true }
12 fn size(self: Self) -> int { default_iterator_size(self) }
13 fn done(self: Self) -> bool { default_iterator_done(self) }
14 fn step(self: Self, other: Self) -> bool { true }
15)]
16trait Iterator {
17 #[spec(
18 fn(self: &mut Self[@curr_s]) -> Option<Self::Item>[!<Self as Iterator>::done(curr_s)]
19 ensures self: Self{next_s: <Self as Iterator>::step(curr_s, next_s)}
20 )]
21 fn next(&mut self) -> Option<Self::Item>;
22
23 #[spec(fn(Self[@s]) -> Enumerate<Self>[0, s])]
24 fn enumerate(self) -> Enumerate<Self>
25 where
26 Self: Sized;
27
28 #[spec(
29 fn(Self[@s], f: F) -> Map<Self, F>[s]
30 where
31 F: FnMut(Self::Item{item: <Self as Iterator>::valid_item(s, item)}) -> B
32 )]
33 fn map<B, F>(self, f: F) -> Map<Self, F>
34 where
35 Self: Sized,
36 F: FnMut(Self::Item) -> B;
37
38 #[spec(fn(Self[@s], n: usize) -> Skip<Self>[max(0, <Self as Iterator>::size(s) - n)])]
39 fn skip(self, n: usize) -> Skip<Self>
40 where
41 Self: Sized;
42
43 #[spec(fn(Self[@s], f: F) where F: FnMut(Self::Item{item: <Self as Iterator>::valid_item(s, item)}) -> () )]
44 fn for_each<F>(self, f: F)
45 where
46 Self: Sized,
47 F: FnMut(Self::Item);
48
49 #[spec(fn (Self[@s]) -> B{v: <B as FromIterator<Self::Item>>::with_size(v, <Self as Iterator>::size(s))})]
50 fn collect<B: FromIterator<Self::Item>>(self) -> B
51 where
52 Self: Sized;
53}