@@ -5,16 +5,10 @@ use super::super::seq::{
55
66use verus as verus_;
77
8- use core:: iter:: { Iterator , Rev } ;
8+ use core:: iter:: { FromIterator , Iterator , Rev } ;
99
1010verus_ ! {
1111
12- #[ verifier:: external_trait_specification]
13- pub trait ExIntoIterator {
14- type ExternalTraitSpecificationFor : core:: iter:: IntoIterator ;
15- }
16-
17-
1812#[ verifier:: external_trait_specification]
1913#[ verifier:: external_trait_extension( IteratorSpec via IteratorSpecImpl ) ]
2014pub trait ExIterator {
@@ -91,6 +85,15 @@ pub trait ExIterator {
9185 r == into_rev_spec( self ) && rev_post( self , r) ,
9286 ;
9387
88+ fn collect<B >( self ) -> ( collection: B )
89+ where
90+ B : FromIterator <Self :: Item >,
91+ Self : Sized ,
92+ default_ensures
93+ self . will_return_none( ) ,
94+ self . obeys_prophetic_iter_laws( ) && self . initial_value_relation( & self ) ==>
95+ FromIteratorSpec :: from_iter_ensures( self . remaining( ) , collection) ,
96+ ;
9497}
9598
9699#[ verifier:: external_trait_specification]
@@ -136,6 +139,50 @@ pub trait ExDoubleEndedIterator : Iterator {
136139 spec fn peek_back( & self , index: int) -> Option <Self :: Item >;
137140}
138141
142+ /********************************************************************************
143+ * Definitions for `IntoIterator` and `FromIterator``
144+ ********************************************************************************/
145+ #[ verifier:: external_trait_specification]
146+ pub trait ExIntoIterator {
147+ type ExternalTraitSpecificationFor : core:: iter:: IntoIterator ;
148+ }
149+
150+ pub open spec fn iter_into_iter_spec<I : Iterator >( i: I ) -> I {
151+ i
152+ }
153+
154+ #[ verifier:: when_used_as_spec( iter_into_iter_spec) ]
155+ pub assume_specification<I : Iterator >[ <I as IntoIterator >:: into_iter ] ( i: I ) -> ( r: I )
156+ ensures
157+ r == i,
158+ ;
159+
160+ // Uninterpreted function representing the sequence of elements that will be
161+ // produced by the iterator obtained from an IntoIterator value.
162+ // This avoids requiring IteratorSpec bounds in from_iter's ensures clause.
163+ pub uninterp spec fn into_iter_remaining<A , T >( iter: T ) -> Seq <A >;
164+
165+ // Connects into_iter_remaining to remaining() for types implementing Iterator + IteratorSpec.
166+ // This allows callers of from_iter to relate the result to the iterator's remaining elements.
167+ pub broadcast axiom fn axiom_from_iterator_ensures<A , I : Iterator <Item = A > + IteratorSpec >( iter: I )
168+ ensures
169+ #[ trigger] into_iter_remaining:: <A , I >( iter) == iter. remaining( ) ,
170+ ;
171+
172+ #[ verifier:: external_trait_specification]
173+ #[ verifier:: external_trait_extension( FromIteratorSpec via FromIteratorSpecImpl ) ]
174+ pub trait ExFromIterator <A >: Sized {
175+ type ExternalTraitSpecificationFor : FromIterator <A >;
176+
177+ spec fn from_iter_ensures( remaining: Seq <A >, s: Self ) -> bool ;
178+
179+ fn from_iter<T >( iter: T ) -> ( s: Self )
180+ where T : IntoIterator <Item = A >
181+ ensures
182+ Self :: from_iter_ensures( into_iter_remaining( iter) , s) ,
183+ ;
184+ }
185+
139186/********************************************************************************
140187 * Definitions for `rev()`
141188 ********************************************************************************/
0 commit comments