Skip to content

Commit

Permalink
Implement Iterator.peekable
Browse files Browse the repository at this point in the history
  • Loading branch information
osa1 committed Jan 25, 2025
1 parent b3e985e commit 0b5ddba
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
27 changes: 27 additions & 0 deletions lib/Iter.fir
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ trait Iterator[t]:
map(self, f: Fn(Item): b): Map[t, Item, b]
Map(iter = self, f = f)

peekable(self): Peekable[t, Item]
Peekable(iter = self, peeked = Option.None)

trait Step[t]:
next(self): t

Expand Down Expand Up @@ -56,3 +59,27 @@ impl[a, b, i: Iterator[Item = a]] Iterator for Map[i, a, b]:
match self.iter.next():
Option.None: Option.None
Option.Some(a): Option.Some(self.f(a))

type Peekable[i, item]:
iter: i
peeked: Option[Option[item]]

Peekable[i: Iterator[Item = item], item].peek(self): Option[item]
match self.peeked:
Option.None:
let peeked = self.iter.next()
self.peeked = Option.Some(peeked)
peeked
Option.Some(peeked):
peeked

impl[item, i: Iterator[Item = item]] Iterator for Peekable[i, item]:
type Item = item

next(self): Option[item]
match self.peeked:
Option.None:
self.iter.next()
Option.Some(peeked):
self.peeked = Option.None
peeked
6 changes: 6 additions & 0 deletions tests/IteratorPeekable.fir
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
main
let s = "asdf"
let iter = s.chars().peekable()
for x in iter:
printStr(iter.peek().toStr())
printStr(x.toStr())

0 comments on commit 0b5ddba

Please sign in to comment.