Created
September 19, 2025 15:18
-
-
Save sstadick/9c1116a3b4e7646bbfc5a99395b84869 to your computer and use it in GitHub Desktop.
Rust flavored iteration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| trait RustyIterator(Copyable, Movable): | |
| alias Element: Copyable & Movable | |
| fn next(mut self) -> Optional[Self.Element]: | |
| ... | |
| @fieldwise_init | |
| struct OwningIterator(RustyIterator): | |
| alias Element = Int | |
| var inner: MyDatastructure | |
| fn next(mut self) -> Optional[Self.Element]: | |
| return self.inner.some_data.pop() if len( | |
| self.inner.some_data | |
| ) > 0 else Optional[Self.Element](None) | |
| @fieldwise_init | |
| struct RefIterator[ | |
| inner_mut: Bool, //, | |
| inner_origin: Origin[inner_mut], | |
| ](RustyIterator): | |
| alias Element = Pointer[Int, inner_origin] | |
| var inner: Pointer[MyDatastructure, inner_origin] | |
| var index: UInt | |
| fn next(mut self) -> Optional[Self.Element]: | |
| if self.index == 0: | |
| return Optional[Self.Element](None) | |
| else: | |
| self.index -= 1 | |
| return rebind[Self.Element]( | |
| Pointer(to=self.inner[].some_data[self.index]) | |
| ) | |
| @fieldwise_init | |
| struct MyDatastructure(Copyable, Movable): | |
| var some_data: List[Int] | |
| fn into_iter(var self) -> OwningIterator: | |
| return OwningIterator(self^) | |
| fn iter(ref self) -> RefIterator[__origin_of(self)]: | |
| return RefIterator(Pointer(to=self), len(self.some_data)) | |
| fn main(): | |
| var mydata = MyDatastructure(List(1, 2, 3, 4, 5)) | |
| var iter_ref = mydata.iter() | |
| while datum := iter_ref.next(): | |
| var ptr = datum.take() | |
| ptr[] += 1 | |
| print(ptr[]) | |
| print("---") | |
| var iter = mydata^.into_iter() | |
| while datum2 := iter.next(): | |
| print(datum2.take()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment