Skip to content

Instantly share code, notes, and snippets.

@sstadick
Created September 19, 2025 15:18
Show Gist options
  • Select an option

  • Save sstadick/9c1116a3b4e7646bbfc5a99395b84869 to your computer and use it in GitHub Desktop.

Select an option

Save sstadick/9c1116a3b4e7646bbfc5a99395b84869 to your computer and use it in GitHub Desktop.
Rust flavored iteration
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