diff --git a/tests/trait/trait-default-collect.dora b/tests/trait/trait-default-collect.dora new file mode 100644 index 000000000..9fdede15e --- /dev/null +++ b/tests/trait/trait-default-collect.dora @@ -0,0 +1,49 @@ +//= ignore + +trait MyIterator { + type Item; + fn next(): Option[Self::Item]; + + fn collect[T](): T where T: MyFromIterator[Self::Item] { + T::fromIter(self) + } +} + +pub trait MyFromIterator[A] { + fn fromIter[T](iter: T): Self where T: MyIterator[Item=A]; +} + +class Range { + value: Int +} + +impl MyIterator for Range { + type Item = Int; + + fn next(): Option[Int] { + if self.value <= 0 { + None[Int] + } else { + let result = self.value; + self.value -= 1; + Some[Int](result) + } + } +} + +impl MyFromIterator[Int] for Vec[Int] { + fn fromIter[T](iter: T): Vec[Int] where T: MyIterator[Item=Int] { + let result = Vec[Int]::new(); + + while iter.next() is Some(value) { + result.push(value); + } + + result + } +} + +fn main() { + let values: Vec[Int] = Range(2).collect[Vec[Int]](); + assert(values == Vec[Int]::new(1, 0)); +}