From f726e54976e3057cb18a6ad0b720bb8338b1d364 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:16:59 -0300 Subject: [PATCH 01/36] fix iterator ergonomics Signed-off-by: martinvuyk --- stdlib/src/builtin/builtin_list.mojo | 4 +- stdlib/src/builtin/range.mojo | 215 ++++++++++++++++++++++-- stdlib/src/builtin/reversed.mojo | 16 ++ stdlib/src/builtin/string_literal.mojo | 16 +- stdlib/src/collections/dict.mojo | 18 +- stdlib/src/collections/inline_list.mojo | 2 +- stdlib/src/collections/list.mojo | 6 +- stdlib/src/collections/string.mojo | 12 +- stdlib/src/collections/vector.mojo | 2 +- stdlib/src/prelude/__init__.mojo | 2 +- stdlib/src/python/python_object.mojo | 2 +- stdlib/src/utils/span.mojo | 2 +- stdlib/src/utils/string_slice.mojo | 38 ++++- 13 files changed, 291 insertions(+), 44 deletions(-) diff --git a/stdlib/src/builtin/builtin_list.mojo b/stdlib/src/builtin/builtin_list.mojo index afec4004b6..385ae19418 100644 --- a/stdlib/src/builtin/builtin_list.mojo +++ b/stdlib/src/builtin/builtin_list.mojo @@ -141,7 +141,7 @@ struct _VariadicListIter[type: AnyTrivialRegType]: return self.src[self.index - 1] @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -252,7 +252,7 @@ struct _VariadicListMemIter[ ) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index a7bd3264bf..3c673ea76c 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -23,6 +23,9 @@ from python import ( ) # TODO: remove this and fixup downstream imports from math import ceildiv from utils._select import _select_register_value as select +from utils.string_slice import StringSlice, _StringSliceIter, Stringlike +from collections.list import _ListIter +from collections.dict import Dict, _DictKeyIter, _DictValueIter, _DictEntryIter # ===----------------------------------------------------------------------=== # # Utilities @@ -63,7 +66,7 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): return self.end - curr @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -97,7 +100,7 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): return start @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -137,7 +140,7 @@ struct _StridedRangeIterator(Sized): return result @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @@ -165,7 +168,7 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): return result @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -339,7 +342,7 @@ struct _UIntZeroStartingRange(UIntSized): return self.end - curr @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -370,7 +373,7 @@ struct _UIntStridedRangeIterator(UIntSized): return result @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @@ -410,7 +413,7 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): return result @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -479,7 +482,7 @@ struct _ZeroStartingScalarRange[type: DType]: return self.end - curr @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -498,6 +501,10 @@ struct _ZeroStartingScalarRange[type: DType]: ]() return range(self.end - 1, Scalar[type](-1), Scalar[type](-1)) + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -516,7 +523,7 @@ struct _SequentialScalarRange[type: DType]: return start @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -532,6 +539,10 @@ struct _SequentialScalarRange[type: DType]: fn __reversed__(self) -> _StridedRange: return range(self.end - 1, self.start - 1, -1) + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -541,7 +552,7 @@ struct _StridedScalarRangeIterator[type: DType]: var step: Scalar[type] @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: # If the type is unsigned, then 'step' cannot be negative. @parameter if type.is_unsigned(): @@ -557,6 +568,10 @@ struct _StridedScalarRangeIterator[type: DType]: self.start += self.step return result + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -625,3 +640,183 @@ fn range[ The constructed range. """ return _StridedScalarRange(start, end, step) + + +# ===----------------------------------------------------------------------=== # +# Utils +# ===----------------------------------------------------------------------=== # + + +trait _Iterator: + fn __iter__(self) -> Self: + ... + + +# TODO: this is the goal +# trait _Iterator[T: AnyType]: +# fn __iter__(self) -> Self: +# ... + +# fn __next__(inout self) -> T: +# ... + +# fn __has_more__(self) -> Bool: +# ... + + +# trait _Iterable[T: AnyType]: +# fn __iter__(ref [_]self) -> _Iterator[T]: +# ... + + +# fn iter[T: AnyType, I: _Iterable[T]](value: T) -> _Iterator[T]: +# ... + +# fn bool[T: AnyType, I: _Iterator[T]](value: I) -> Bool: +# return value.__has_more__() + + +fn iter[T: _Iterator](value: T) -> T: + """Get an iterator from the iterator. + + Parameters: + T: The type conforming to _Iterator. + + Args: + value: The value to get the iterator of. + + Returns: + The iterator of the value. + """ + return value.__iter__() + + +fn iter[ + T: DType +](value: _StridedScalarRange[T]) -> _StridedScalarRangeIterator[T]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + return value.__iter__() + + +@always_inline +fn iter[ + T: CollectionElement +]( + ref [_]value: List[T, *_], +) -> _ListIter[ + T, __type_of(value).hint_trivial_type, __origin_of(value) +]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + return value.__iter__() + + +fn iter[ + K: KeyElement, + V: CollectionElement, +](ref [_]value: Dict[K, V],) -> _DictKeyIter[K, V, __origin_of(value), False]: + """Get an iterator of the input dict. + + **Note**: iterators are currently non-raising. + + Parameters: + K: The type of the keys in the dict. + V: The type of the values in the dict. + + Args: + value: The dict to get the iterator of. + + Returns: + The iterator of the dict keys. + """ + return value.__reversed__() + + +fn iter[ + K: KeyElement, + V: CollectionElement, + dict_mutability: Bool, + dict_origin: Origin[dict_mutability].type, +](ref [_]value: _DictValueIter[K, V, dict_origin]) -> _DictValueIter[ + K, V, dict_origin +]: + """Get an iterator of the input dict values. + + **Note**: iterators are currently non-raising. + + Parameters: + K: The type of the keys in the dict. + V: The type of the values in the dict. + dict_mutability: Whether the reference to the dict values is mutable. + dict_origin: The origin of the dict values. + + Args: + value: The dict values to get the iterator of. + + Returns: + The iterator of the dict values. + """ + return value.__iter__() + + +fn iter[ + K: KeyElement, + V: CollectionElement, + dict_mutability: Bool, + dict_origin: Origin[dict_mutability].type, +](ref [_]value: _DictEntryIter[K, V, dict_origin]) -> _DictEntryIter[ + K, V, dict_origin +]: + """Get an iterator of the input dict items. + + **Note**: iterators are currently non-raising. + + Parameters: + K: The type of the keys in the dict. + V: The type of the values in the dict. + dict_mutability: Whether the reference to the dict items is mutable. + dict_origin: The origin of the dict items. + + Args: + value: The dict items to get the iterator of. + + Returns: + The iterator of the dict items. + """ + var src = value.src + return _DictEntryIter[K, V, dict_origin](src[]._reserved() - 1, 0, src) + + +@always_inline +fn iter[T: Stringlike](ref [_]value: T) -> _StringSliceIter[__origin_of(value)]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + return value.__iter__() diff --git a/stdlib/src/builtin/reversed.mojo b/stdlib/src/builtin/reversed.mojo index 0ddb24621b..1e8a4316d4 100644 --- a/stdlib/src/builtin/reversed.mojo +++ b/stdlib/src/builtin/reversed.mojo @@ -18,6 +18,7 @@ These are Mojo built-ins, so you don't need to import them. from collections import Dict from collections.dict import _DictEntryIter, _DictKeyIter, _DictValueIter from collections.list import _ListIter +from utils.string_slice import _StringSliceIter, StringSlice, Stringlike from .range import _StridedRange @@ -173,3 +174,18 @@ fn reversed[ return _DictEntryIter[K, V, dict_origin, False]( src[]._reserved() - 1, 0, src ) + + +@always_inline +fn reversed[ + T: Stringlike +](ref [_]value: T) -> _StringSliceIter[__origin_of(value), forward=False]: + """Return a reversed iterator. + + Args: + value: The iterable value. + + Returns: + The type's reversed Iterator. + """ + return value.__reversed__() diff --git a/stdlib/src/builtin/string_literal.mojo b/stdlib/src/builtin/string_literal.mojo index 5edcd74b20..5f1b95b781 100644 --- a/stdlib/src/builtin/string_literal.mojo +++ b/stdlib/src/builtin/string_literal.mojo @@ -293,23 +293,23 @@ struct StringLiteral( """ return self.__str__() - fn __iter__(ref [_]self) -> _StringSliceIter[StaticConstantOrigin]: - """Return an iterator over the string literal. + fn __iter__(ref [_]self) -> _StringSliceIter[__origin_of(self)]: + """Iterate over the string unicode characters. Returns: - An iterator over the string. + An iterator of references to the string unicode characters. """ - return _StringSliceIter[StaticConstantOrigin]( + return _StringSliceIter[__origin_of(self)]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(self) -> _StringSliceIter[StaticConstantOrigin, False]: - """Iterate backwards over the string, returning immutable references. + fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + """Iterate backwards over the string unicode characters. Returns: - A reversed iterator over the string. + A reversed iterator of references to the string unicode characters. """ - return _StringSliceIter[StaticConstantOrigin, False]( + return _StringSliceIter[__origin_of(self), False]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 07ffbfd6ce..37e31ac22a 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -107,12 +107,16 @@ struct _DictEntryIter[ return Pointer.address_of(opt_entry_ref[].value()) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: return len(self.src[]) - self.seen + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value struct _DictKeyIter[ @@ -145,12 +149,16 @@ struct _DictKeyIter[ return Pointer.address_of(self.iter.__next__()[].key) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: return self.iter.__len__() + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value struct _DictValueIter[ @@ -195,12 +203,16 @@ struct _DictValueIter[ ) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: return self.iter.__len__() + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value struct DictEntry[K: KeyElement, V: CollectionElement]( diff --git a/stdlib/src/collections/inline_list.mojo b/stdlib/src/collections/inline_list.mojo index 97f253fd50..665d598f05 100644 --- a/stdlib/src/collections/inline_list.mojo +++ b/stdlib/src/collections/inline_list.mojo @@ -64,7 +64,7 @@ struct _InlineListIter[ return Pointer.address_of(self.src[][self.index]) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: diff --git a/stdlib/src/collections/list.mojo b/stdlib/src/collections/list.mojo index 1587298703..ab597204f0 100644 --- a/stdlib/src/collections/list.mojo +++ b/stdlib/src/collections/list.mojo @@ -72,7 +72,7 @@ struct _ListIter[ return Pointer.address_of(self.src[][self.index]) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -82,6 +82,10 @@ struct _ListIter[ else: return self.index + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + struct List[T: CollectionElement, hint_trivial_type: Bool = False]( CollectionElement, CollectionElementNew, Sized, Boolable diff --git a/stdlib/src/collections/string.mojo b/stdlib/src/collections/string.mojo index 4b72ad89a1..c3bbd3d986 100644 --- a/stdlib/src/collections/string.mojo +++ b/stdlib/src/collections/string.mojo @@ -1241,21 +1241,21 @@ struct String( """ self._iadd[False](other.as_bytes()) - fn __iter__(self) -> _StringSliceIter[__origin_of(self)]: - """Iterate over the string, returning immutable references. + fn __iter__(ref [_]self) -> _StringSliceIter[__origin_of(self)]: + """Iterate over the string unicode characters. Returns: - An iterator of references to the string elements. + An iterator of references to the string unicode characters. """ return _StringSliceIter[__origin_of(self)]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(self) -> _StringSliceIter[__origin_of(self), False]: - """Iterate backwards over the string, returning immutable references. + fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + """Iterate backwards over the string unicode characters. Returns: - A reversed iterator of references to the string elements. + A reversed iterator of references to the string unicode characters. """ return _StringSliceIter[__origin_of(self), forward=False]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() diff --git a/stdlib/src/collections/vector.mojo b/stdlib/src/collections/vector.mojo index f2452865c3..038a40c401 100644 --- a/stdlib/src/collections/vector.mojo +++ b/stdlib/src/collections/vector.mojo @@ -46,7 +46,7 @@ struct _VecIter[ return deref(self.vec, self.i - 1) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: diff --git a/stdlib/src/prelude/__init__.mojo b/stdlib/src/prelude/__init__.mojo index 7d7badc1a2..3be53bebab 100644 --- a/stdlib/src/prelude/__init__.mojo +++ b/stdlib/src/prelude/__init__.mojo @@ -62,7 +62,7 @@ from builtin.math import ( ) from builtin.none import NoneType from builtin.object import Attr, object -from builtin.range import range +from builtin.range import range, iter from builtin.rebind import rebind from builtin.repr import Representable, repr from builtin.reversed import ReversibleRange, reversed diff --git a/stdlib/src/python/python_object.mojo b/stdlib/src/python/python_object.mojo index 13715b01f4..aff7fb0f52 100644 --- a/stdlib/src/python/python_object.mojo +++ b/stdlib/src/python/python_object.mojo @@ -106,7 +106,7 @@ struct _PyIter(Sized): return current @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: diff --git a/stdlib/src/utils/span.mojo b/stdlib/src/utils/span.mojo index 305b4d1381..0f8e6d34f1 100644 --- a/stdlib/src/utils/span.mojo +++ b/stdlib/src/utils/span.mojo @@ -79,7 +79,7 @@ struct _SpanIter[ return Pointer.address_of(self.src[self.index]) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 @always_inline diff --git a/stdlib/src/utils/string_slice.mojo b/stdlib/src/utils/string_slice.mojo index c7fbd8a76c..889a44968e 100644 --- a/stdlib/src/utils/string_slice.mojo +++ b/stdlib/src/utils/string_slice.mojo @@ -248,7 +248,7 @@ struct _StringSliceIter[ ) @always_inline - fn __hasmore__(self) -> Bool: + fn __has_more__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -258,6 +258,10 @@ struct _StringSliceIter[ else: return self.index - self.continuation_bytes + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value struct StringSlice[is_mutable: Bool, //, origin: Origin[is_mutable].type,]( @@ -545,23 +549,23 @@ struct StringSlice[is_mutable: Bool, //, origin: Origin[is_mutable].type,]( self.unsafe_ptr(), rhs.unsafe_ptr(), min(len1, len2) ) - fn __iter__(self) -> _StringSliceIter[origin]: - """Iterate over the string, returning immutable references. + fn __iter__(ref [_]self) -> _StringSliceIter[__origin_of(self)]: + """Iterate over the string unicode characters. Returns: - An iterator of references to the string elements. + An iterator of references to the string unicode characters. """ - return _StringSliceIter[origin]( + return _StringSliceIter[__origin_of(self)]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(self) -> _StringSliceIter[origin, False]: - """Iterate backwards over the string, returning immutable references. + fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + """Iterate backwards over the string unicode characters. Returns: - A reversed iterator of references to the string elements. + A reversed iterator of references to the string unicode characters. """ - return _StringSliceIter[origin, forward=False]( + return _StringSliceIter[__origin_of(self), forward=False]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) @@ -986,6 +990,22 @@ trait Stringlike: """ ... + fn __iter__(ref [_]self) -> _StringSliceIter[__origin_of(self)]: + """Iterate over the string unicode characters. + + Returns: + An iterator of references to the string unicode characters. + """ + ... + + fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + """Iterate backwards over the string unicode characters. + + Returns: + A reversed iterator of references to the string unicode characters. + """ + ... + # ===----------------------------------------------------------------------===# # Format method structures From a68b6357fef67b066b48ca5a0f2ac6d89fc09399 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:19:09 -0300 Subject: [PATCH 02/36] fix detail Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 3 --- 1 file changed, 3 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 3c673ea76c..7e33cadc5d 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -672,9 +672,6 @@ trait _Iterator: # fn iter[T: AnyType, I: _Iterable[T]](value: T) -> _Iterator[T]: # ... -# fn bool[T: AnyType, I: _Iterator[T]](value: I) -> Bool: -# return value.__has_more__() - fn iter[T: _Iterator](value: T) -> T: """Get an iterator from the iterator. From 71540b05cbedf4f4f2f73c6af95d67f0a399d9fa Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:27:00 -0300 Subject: [PATCH 03/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 7e33cadc5d..f5ade44980 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -82,6 +82,10 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): fn __reversed__(self) -> _StridedRange: return range(self.end - 1, -1, -1) + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -116,6 +120,10 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): fn __reversed__(self) -> _StridedRange: return range(self.end - 1, self.start - 1, -1) + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -143,6 +151,10 @@ struct _StridedRangeIterator(Sized): fn __has_more__(self) -> Bool: return self.__len__() > 0 + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -201,6 +213,10 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): var step = -self.step return range(start, end, step) + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @always_inline fn range[type: Intable](end: type) -> _ZeroStartingRange: @@ -354,6 +370,10 @@ struct _UIntZeroStartingRange(UIntSized): debug_assert(idx < self.__len__(), "index out of range") return idx + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -376,6 +396,10 @@ struct _UIntStridedRangeIterator(UIntSized): fn __has_more__(self) -> Bool: return self.__len__() > 0 + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value @register_passable("trivial") @@ -427,6 +451,10 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): debug_assert(idx < self.__len__(), "index out of range") return self.start + idx * self.step + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @always_inline fn range(end: UInt) -> _UIntZeroStartingRange: From 4d0be8db3021b95c676b28daad696f09510d392a Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:28:01 -0300 Subject: [PATCH 04/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/builtin_list.mojo | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/stdlib/src/builtin/builtin_list.mojo b/stdlib/src/builtin/builtin_list.mojo index 385ae19418..bbb1a381a6 100644 --- a/stdlib/src/builtin/builtin_list.mojo +++ b/stdlib/src/builtin/builtin_list.mojo @@ -147,6 +147,10 @@ struct _VariadicListIter[type: AnyTrivialRegType]: fn __len__(self) -> Int: return len(self.src) - self.index + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @register_passable("trivial") struct VariadicList[type: AnyTrivialRegType](Sized): @@ -258,6 +262,10 @@ struct _VariadicListMemIter[ fn __len__(self) -> Int: return len(self.src[]) - self.index + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + # Helper to compute the union of two origins: # TODO: parametric aliases would be nice. From e8ffe4eb27f062fd93967037c9496a93284e21e1 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:30:04 -0300 Subject: [PATCH 05/36] fix details Signed-off-by: martinvuyk --- stdlib/src/collections/inline_list.mojo | 4 ++++ stdlib/src/collections/vector.mojo | 4 ++++ stdlib/src/python/python_object.mojo | 4 ++++ stdlib/src/utils/span.mojo | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/stdlib/src/collections/inline_list.mojo b/stdlib/src/collections/inline_list.mojo index 665d598f05..24fd91ed4c 100644 --- a/stdlib/src/collections/inline_list.mojo +++ b/stdlib/src/collections/inline_list.mojo @@ -74,6 +74,10 @@ struct _InlineListIter[ else: return self.index + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + # TODO: Provide a smarter default for the capacity. struct InlineList[ElementType: CollectionElementNew, capacity: Int = 16](Sized): diff --git a/stdlib/src/collections/vector.mojo b/stdlib/src/collections/vector.mojo index 038a40c401..44329ba21a 100644 --- a/stdlib/src/collections/vector.mojo +++ b/stdlib/src/collections/vector.mojo @@ -52,6 +52,10 @@ struct _VecIter[ fn __len__(self) -> Int: return self.size - self.i + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + # ===----------------------------------------------------------------------===# # InlinedFixedVector diff --git a/stdlib/src/python/python_object.mojo b/stdlib/src/python/python_object.mojo index aff7fb0f52..a917d69c8a 100644 --- a/stdlib/src/python/python_object.mojo +++ b/stdlib/src/python/python_object.mojo @@ -120,6 +120,10 @@ struct _PyIter(Sized): else: return 1 + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @register_passable struct TypedPythonObject[type_hint: StringLiteral]( diff --git a/stdlib/src/utils/span.mojo b/stdlib/src/utils/span.mojo index 0f8e6d34f1..51098c6af8 100644 --- a/stdlib/src/utils/span.mojo +++ b/stdlib/src/utils/span.mojo @@ -90,6 +90,10 @@ struct _SpanIter[ else: return self.index + @always_inline + fn __bool__(self) -> Bool: + return self.__has_more__() + @value struct Span[ From cf47de23534d8faaf509cfe47e9c8753dbc19bc8 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:32:12 -0300 Subject: [PATCH 06/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index f5ade44980..b0a2f45c79 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -691,14 +691,17 @@ trait _Iterator: # fn __has_more__(self) -> Bool: # ... +# fn __bool__(self) -> Bool: +# return self.__has_more__() + # trait _Iterable[T: AnyType]: # fn __iter__(ref [_]self) -> _Iterator[T]: # ... -# fn iter[T: AnyType, I: _Iterable[T]](value: T) -> _Iterator[T]: -# ... +# fn iter[T: _Iterable](ref [_]value: T) -> _Iterator[T]: +# return value.__iter__() fn iter[T: _Iterator](value: T) -> T: From 46b8ae399dbcc75115b5aad0aa0f61ba1137a326 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:32:56 -0300 Subject: [PATCH 07/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index b0a2f45c79..57d7ffd88b 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -700,7 +700,7 @@ trait _Iterator: # ... -# fn iter[T: _Iterable](ref [_]value: T) -> _Iterator[T]: +# fn iter[T: AnyType, I: _Iterable[T]](ref [_]value: I) -> _Iterator[T]: # return value.__iter__() From 42b23eba27a0c3a9577aa85e27bea3d46a6544d3 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:41:57 -0300 Subject: [PATCH 08/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 42 +++++++++++------------------------ 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 57d7ffd88b..498fa9a9cb 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -739,9 +739,7 @@ fn iter[ @always_inline fn iter[ T: CollectionElement -]( - ref [_]value: List[T, *_], -) -> _ListIter[ +](ref [_]value: List[T, *_]) -> _ListIter[ T, __type_of(value).hint_trivial_type, __origin_of(value) ]: """Return an iterator. @@ -759,9 +757,8 @@ fn iter[ fn iter[ - K: KeyElement, - V: CollectionElement, -](ref [_]value: Dict[K, V],) -> _DictKeyIter[K, V, __origin_of(value), False]: + K: KeyElement, V: CollectionElement +](ref [_]value: Dict[K, V]) -> _DictKeyIter[K, V, __origin_of(value)]: """Get an iterator of the input dict. **Note**: iterators are currently non-raising. @@ -776,26 +773,19 @@ fn iter[ Returns: The iterator of the dict keys. """ - return value.__reversed__() + return value.__iter__() fn iter[ - K: KeyElement, - V: CollectionElement, - dict_mutability: Bool, - dict_origin: Origin[dict_mutability].type, -](ref [_]value: _DictValueIter[K, V, dict_origin]) -> _DictValueIter[ - K, V, dict_origin -]: + K: KeyElement, V: CollectionElement +](ref [_]value: _DictValueIter[K, V, *_]) -> _DictValueIter[ + K, V, __type_of(value).dict_origin +] as output: """Get an iterator of the input dict values. - **Note**: iterators are currently non-raising. - Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. - dict_mutability: Whether the reference to the dict values is mutable. - dict_origin: The origin of the dict values. Args: value: The dict values to get the iterator of. @@ -803,26 +793,20 @@ fn iter[ Returns: The iterator of the dict values. """ - return value.__iter__() + output = rebind[__type_of(output)](value.__iter__()) fn iter[ K: KeyElement, V: CollectionElement, - dict_mutability: Bool, - dict_origin: Origin[dict_mutability].type, -](ref [_]value: _DictEntryIter[K, V, dict_origin]) -> _DictEntryIter[ - K, V, dict_origin -]: +](ref [_]value: _DictEntryIter[K, V, *_]) -> _DictEntryIter[ + K, V, __type_of(value).dict_origin +] as output: """Get an iterator of the input dict items. - **Note**: iterators are currently non-raising. - Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. - dict_mutability: Whether the reference to the dict items is mutable. - dict_origin: The origin of the dict items. Args: value: The dict items to get the iterator of. @@ -831,7 +815,7 @@ fn iter[ The iterator of the dict items. """ var src = value.src - return _DictEntryIter[K, V, dict_origin](src[]._reserved() - 1, 0, src) + output = __type_of(output)(src[]._reserved() - 1, 0, src) @always_inline From b02899e139db09dc8c1092d9a0c2ae071606f18f Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 21 Oct 2024 23:43:04 -0300 Subject: [PATCH 09/36] fix detail Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 2 -- 1 file changed, 2 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 498fa9a9cb..aa79af46a1 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -761,8 +761,6 @@ fn iter[ ](ref [_]value: Dict[K, V]) -> _DictKeyIter[K, V, __origin_of(value)]: """Get an iterator of the input dict. - **Note**: iterators are currently non-raising. - Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. From 542d409d970cb1689bd0397f6570d255c0ee8d62 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Tue, 22 Oct 2024 08:10:23 -0300 Subject: [PATCH 10/36] revert name change and add next methods Signed-off-by: martinvuyk --- stdlib/src/builtin/builtin_list.mojo | 8 +- stdlib/src/builtin/range.mojo | 205 +++++++++++++++++++++--- stdlib/src/collections/dict.mojo | 12 +- stdlib/src/collections/inline_list.mojo | 4 +- stdlib/src/collections/list.mojo | 4 +- stdlib/src/collections/vector.mojo | 4 +- stdlib/src/prelude/__init__.mojo | 2 +- stdlib/src/python/python_object.mojo | 4 +- stdlib/src/utils/span.mojo | 4 +- stdlib/src/utils/string_slice.mojo | 4 +- 10 files changed, 205 insertions(+), 46 deletions(-) diff --git a/stdlib/src/builtin/builtin_list.mojo b/stdlib/src/builtin/builtin_list.mojo index bbb1a381a6..6c3cd76355 100644 --- a/stdlib/src/builtin/builtin_list.mojo +++ b/stdlib/src/builtin/builtin_list.mojo @@ -141,7 +141,7 @@ struct _VariadicListIter[type: AnyTrivialRegType]: return self.src[self.index - 1] @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -149,7 +149,7 @@ struct _VariadicListIter[type: AnyTrivialRegType]: @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @register_passable("trivial") @@ -256,7 +256,7 @@ struct _VariadicListMemIter[ ) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -264,7 +264,7 @@ struct _VariadicListMemIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() # Helper to compute the union of two origins: diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index aa79af46a1..1466ec6015 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -25,7 +25,13 @@ from math import ceildiv from utils._select import _select_register_value as select from utils.string_slice import StringSlice, _StringSliceIter, Stringlike from collections.list import _ListIter -from collections.dict import Dict, _DictKeyIter, _DictValueIter, _DictEntryIter +from collections.dict import ( + Dict, + _DictKeyIter, + _DictValueIter, + _DictEntryIter, + DictEntry, +) # ===----------------------------------------------------------------------=== # # Utilities @@ -66,7 +72,7 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): return self.end - curr @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -84,7 +90,7 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -104,7 +110,7 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): return start @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -122,7 +128,7 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -148,12 +154,12 @@ struct _StridedRangeIterator(Sized): return result @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -180,7 +186,7 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): return result @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -215,7 +221,7 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @always_inline @@ -358,7 +364,7 @@ struct _UIntZeroStartingRange(UIntSized): return self.end - curr @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -372,7 +378,7 @@ struct _UIntZeroStartingRange(UIntSized): @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -393,12 +399,12 @@ struct _UIntStridedRangeIterator(UIntSized): return result @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -437,7 +443,7 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): return result @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -453,7 +459,7 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @always_inline @@ -510,7 +516,7 @@ struct _ZeroStartingScalarRange[type: DType]: return self.end - curr @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -531,7 +537,7 @@ struct _ZeroStartingScalarRange[type: DType]: @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -551,7 +557,7 @@ struct _SequentialScalarRange[type: DType]: return start @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -569,7 +575,7 @@ struct _SequentialScalarRange[type: DType]: @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -580,7 +586,7 @@ struct _StridedScalarRangeIterator[type: DType]: var step: Scalar[type] @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: # If the type is unsigned, then 'step' cannot be negative. @parameter if type.is_unsigned(): @@ -598,7 +604,7 @@ struct _StridedScalarRangeIterator[type: DType]: @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -688,11 +694,11 @@ trait _Iterator: # fn __next__(inout self) -> T: # ... -# fn __has_more__(self) -> Bool: +# fn __hasmore__(self) -> Bool: # ... # fn __bool__(self) -> Bool: -# return self.__has_more__() +# return self.__hasmore__() # trait _Iterable[T: AnyType]: @@ -703,6 +709,10 @@ trait _Iterator: # fn iter[T: AnyType, I: _Iterable[T]](ref [_]value: I) -> _Iterator[T]: # return value.__iter__() +# fn next[T: AnyType, I: _Iterable[T]](value: I) -> T: +# debug_assert(bool(value), "iterator has no next value to yield") +# return value.__next__() + fn iter[T: _Iterator](value: T) -> T: """Get an iterator from the iterator. @@ -830,3 +840,152 @@ fn iter[T: Stringlike](ref [_]value: T) -> _StringSliceIter[__origin_of(value)]: The type's Iterator. """ return value.__iter__() + + +fn next[T: DType](inout value: _ZeroStartingScalarRange[T]) -> Scalar[T]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +fn next[T: DType](inout value: _SequentialScalarRange[T]) -> Scalar[T]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +fn next[T: DType](inout value: _StridedScalarRangeIterator[T]) -> Scalar[T]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +fn next(inout value: _UIntZeroStartingRange) -> UInt: + """Return an iterator. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +fn next(inout value: _UIntStridedRangeIterator) -> UInt: + """Return an iterator. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +@always_inline +fn next[ + T: CollectionElement +](inout value: _ListIter[T, *_]) -> Pointer[T, __type_of(value).list_origin]: + """Return an iterator. + + Parameters: + T: The type that the iterator yields. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +fn next[ + K: KeyElement, V: CollectionElement +](inout value: _DictValueIter[K, V, *_]) -> Pointer[ + V, __type_of(value).dict_origin +]: + """Get an iterator of the input dict values. + + Parameters: + K: The type of the keys in the dict. + V: The type of the values in the dict. + + Args: + value: The dict values to get the iterator of. + + Returns: + The iterator of the dict values. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() + + +fn next[ + K: KeyElement, V: CollectionElement +](inout value: _DictEntryIter[K, V, *_]) -> Pointer[ + DictEntry[K, V], __type_of(value).dict_origin +] as output: + """Get an iterator of the input dict items. + + Parameters: + K: The type of the keys in the dict. + V: The type of the values in the dict. + + Args: + value: The dict items to get the iterator of. + + Returns: + The iterator of the dict items. + """ + debug_assert(bool(value), "iterator has no next value to yield") + output = rebind[__type_of(output)](value.__next__()) + + +@always_inline +fn next(inout value: _StringSliceIter) -> StringSlice[__type_of(value).origin]: + """Return an iterator. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + debug_assert(bool(value), "iterator has no next value to yield") + return value.__next__() diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 37e31ac22a..a63a6af29e 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -107,7 +107,7 @@ struct _DictEntryIter[ return Pointer.address_of(opt_entry_ref[].value()) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -115,7 +115,7 @@ struct _DictEntryIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -149,7 +149,7 @@ struct _DictKeyIter[ return Pointer.address_of(self.iter.__next__()[].key) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -157,7 +157,7 @@ struct _DictKeyIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value @@ -203,7 +203,7 @@ struct _DictValueIter[ ) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -211,7 +211,7 @@ struct _DictValueIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value diff --git a/stdlib/src/collections/inline_list.mojo b/stdlib/src/collections/inline_list.mojo index 24fd91ed4c..4b66b43119 100644 --- a/stdlib/src/collections/inline_list.mojo +++ b/stdlib/src/collections/inline_list.mojo @@ -64,7 +64,7 @@ struct _InlineListIter[ return Pointer.address_of(self.src[][self.index]) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -76,7 +76,7 @@ struct _InlineListIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() # TODO: Provide a smarter default for the capacity. diff --git a/stdlib/src/collections/list.mojo b/stdlib/src/collections/list.mojo index ab597204f0..6908164b03 100644 --- a/stdlib/src/collections/list.mojo +++ b/stdlib/src/collections/list.mojo @@ -72,7 +72,7 @@ struct _ListIter[ return Pointer.address_of(self.src[][self.index]) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -84,7 +84,7 @@ struct _ListIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() struct List[T: CollectionElement, hint_trivial_type: Bool = False]( diff --git a/stdlib/src/collections/vector.mojo b/stdlib/src/collections/vector.mojo index 44329ba21a..4ae8995e5c 100644 --- a/stdlib/src/collections/vector.mojo +++ b/stdlib/src/collections/vector.mojo @@ -46,7 +46,7 @@ struct _VecIter[ return deref(self.vec, self.i - 1) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -54,7 +54,7 @@ struct _VecIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() # ===----------------------------------------------------------------------===# diff --git a/stdlib/src/prelude/__init__.mojo b/stdlib/src/prelude/__init__.mojo index 3be53bebab..47e3d2e5cd 100644 --- a/stdlib/src/prelude/__init__.mojo +++ b/stdlib/src/prelude/__init__.mojo @@ -62,7 +62,7 @@ from builtin.math import ( ) from builtin.none import NoneType from builtin.object import Attr, object -from builtin.range import range, iter +from builtin.range import range, iter, next from builtin.rebind import rebind from builtin.repr import Representable, repr from builtin.reversed import ReversibleRange, reversed diff --git a/stdlib/src/python/python_object.mojo b/stdlib/src/python/python_object.mojo index a917d69c8a..b946766b13 100644 --- a/stdlib/src/python/python_object.mojo +++ b/stdlib/src/python/python_object.mojo @@ -106,7 +106,7 @@ struct _PyIter(Sized): return current @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -122,7 +122,7 @@ struct _PyIter(Sized): @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @register_passable diff --git a/stdlib/src/utils/span.mojo b/stdlib/src/utils/span.mojo index 51098c6af8..146f6770b7 100644 --- a/stdlib/src/utils/span.mojo +++ b/stdlib/src/utils/span.mojo @@ -79,7 +79,7 @@ struct _SpanIter[ return Pointer.address_of(self.src[self.index]) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 @always_inline @@ -92,7 +92,7 @@ struct _SpanIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value diff --git a/stdlib/src/utils/string_slice.mojo b/stdlib/src/utils/string_slice.mojo index 889a44968e..d432d3a0d6 100644 --- a/stdlib/src/utils/string_slice.mojo +++ b/stdlib/src/utils/string_slice.mojo @@ -248,7 +248,7 @@ struct _StringSliceIter[ ) @always_inline - fn __has_more__(self) -> Bool: + fn __hasmore__(self) -> Bool: return self.__len__() > 0 fn __len__(self) -> Int: @@ -260,7 +260,7 @@ struct _StringSliceIter[ @always_inline fn __bool__(self) -> Bool: - return self.__has_more__() + return self.__hasmore__() @value From 9cd0a2857433f55cb865f6833c68d22662011ef4 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Tue, 22 Oct 2024 08:13:53 -0300 Subject: [PATCH 11/36] fix detail Signed-off-by: martinvuyk --- stdlib/src/builtin/reversed.mojo | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/stdlib/src/builtin/reversed.mojo b/stdlib/src/builtin/reversed.mojo index 1e8a4316d4..d3c5eddf26 100644 --- a/stdlib/src/builtin/reversed.mojo +++ b/stdlib/src/builtin/reversed.mojo @@ -63,8 +63,6 @@ trait ReversibleRange: fn reversed[T: ReversibleRange](value: T) -> _StridedRange: """Get a reversed iterator of the input range. - **Note**: iterators are currently non-raising. - Parameters: T: The type conforming to ReversibleRange. @@ -84,8 +82,6 @@ fn reversed[ ]: """Get a reversed iterator of the input list. - **Note**: iterators are currently non-raising. - Parameters: T: The type of the elements in the list. @@ -104,8 +100,6 @@ fn reversed[ ](ref [_]value: Dict[K, V],) -> _DictKeyIter[K, V, __origin_of(value), False]: """Get a reversed iterator of the input dict. - **Note**: iterators are currently non-raising. - Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. @@ -129,8 +123,6 @@ fn reversed[ ]: """Get a reversed iterator of the input dict values. - **Note**: iterators are currently non-raising. - Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. @@ -156,8 +148,6 @@ fn reversed[ ]: """Get a reversed iterator of the input dict items. - **Note**: iterators are currently non-raising. - Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. @@ -182,6 +172,9 @@ fn reversed[ ](ref [_]value: T) -> _StringSliceIter[__origin_of(value), forward=False]: """Return a reversed iterator. + Parameters: + T: The Stringlike type. + Args: value: The iterable value. From f8c05911ab862efe3f657757965c91320f2ea774 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Wed, 6 Nov 2024 12:25:05 -0300 Subject: [PATCH 12/36] fix __hasmore__ -> __has_next__ Signed-off-by: martinvuyk --- stdlib/src/builtin/builtin_list.mojo | 4 ++-- stdlib/src/builtin/range.mojo | 24 ++++++++++++------------ stdlib/src/collections/dict.mojo | 6 +++--- stdlib/src/collections/inline_list.mojo | 2 +- stdlib/src/collections/list.mojo | 2 +- stdlib/src/collections/vector.mojo | 2 +- stdlib/src/python/python_object.mojo | 2 +- stdlib/src/utils/span.mojo | 2 +- stdlib/src/utils/string_slice.mojo | 2 +- 9 files changed, 23 insertions(+), 23 deletions(-) diff --git a/stdlib/src/builtin/builtin_list.mojo b/stdlib/src/builtin/builtin_list.mojo index 16a90f6572..f7fb994aba 100644 --- a/stdlib/src/builtin/builtin_list.mojo +++ b/stdlib/src/builtin/builtin_list.mojo @@ -148,7 +148,7 @@ struct _VariadicListIter[type: AnyTrivialRegType]: @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @register_passable("trivial") @@ -263,7 +263,7 @@ struct _VariadicListMemIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() # Helper to compute the union of two origins: diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index ecb185c40f..58dfd5e1da 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -90,7 +90,7 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -128,7 +128,7 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -159,7 +159,7 @@ struct _StridedRangeIterator(Sized): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -221,7 +221,7 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @always_inline @@ -378,7 +378,7 @@ struct _UIntZeroStartingRange(UIntSized): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -404,7 +404,7 @@ struct _UIntStridedRangeIterator(UIntSized): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -459,7 +459,7 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @always_inline @@ -537,7 +537,7 @@ struct _ZeroStartingScalarRange[type: DType]: @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -575,7 +575,7 @@ struct _SequentialScalarRange[type: DType]: @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -604,7 +604,7 @@ struct _StridedScalarRangeIterator[type: DType]: @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -694,11 +694,11 @@ trait _Iterator: # fn __next__(inout self) -> T: # ... -# fn __hasmore__(self) -> Bool: +# fn __has_next__(self) -> Bool: # ... # fn __bool__(self) -> Bool: -# return self.__hasmore__() +# return self.__has_next__() # trait _Iterable[T: AnyType]: diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 4e7bad34a1..ed92e96c2a 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -115,7 +115,7 @@ struct _DictEntryIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -157,7 +157,7 @@ struct _DictKeyIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value @@ -211,7 +211,7 @@ struct _DictValueIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value diff --git a/stdlib/src/collections/inline_list.mojo b/stdlib/src/collections/inline_list.mojo index 98b0eeb15f..d9b6e7d8d4 100644 --- a/stdlib/src/collections/inline_list.mojo +++ b/stdlib/src/collections/inline_list.mojo @@ -76,7 +76,7 @@ struct _InlineListIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() # TODO: Provide a smarter default for the capacity. diff --git a/stdlib/src/collections/list.mojo b/stdlib/src/collections/list.mojo index 97d54e5466..7cb2863591 100644 --- a/stdlib/src/collections/list.mojo +++ b/stdlib/src/collections/list.mojo @@ -84,7 +84,7 @@ struct _ListIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() struct List[T: CollectionElement, hint_trivial_type: Bool = False]( diff --git a/stdlib/src/collections/vector.mojo b/stdlib/src/collections/vector.mojo index a91ee38af1..1e6bbb1a94 100644 --- a/stdlib/src/collections/vector.mojo +++ b/stdlib/src/collections/vector.mojo @@ -54,7 +54,7 @@ struct _VecIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() # ===----------------------------------------------------------------------===# diff --git a/stdlib/src/python/python_object.mojo b/stdlib/src/python/python_object.mojo index a289e08181..7795ff619d 100644 --- a/stdlib/src/python/python_object.mojo +++ b/stdlib/src/python/python_object.mojo @@ -121,7 +121,7 @@ struct _PyIter(Sized): @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @register_passable diff --git a/stdlib/src/utils/span.mojo b/stdlib/src/utils/span.mojo index f7502bc476..d91ff185db 100644 --- a/stdlib/src/utils/span.mojo +++ b/stdlib/src/utils/span.mojo @@ -92,7 +92,7 @@ struct _SpanIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value diff --git a/stdlib/src/utils/string_slice.mojo b/stdlib/src/utils/string_slice.mojo index 0a7fe1dc26..4965f6a869 100644 --- a/stdlib/src/utils/string_slice.mojo +++ b/stdlib/src/utils/string_slice.mojo @@ -242,7 +242,7 @@ struct _StringSliceIter[ @always_inline fn __bool__(self) -> Bool: - return self.__hasmore__() + return self.__has_next__() @value From 9adce7901ac391fa584cd3753ad8e4c5d4e881e8 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 15 Nov 2024 14:14:11 -0300 Subject: [PATCH 13/36] remove bool dunders Signed-off-by: martinvuyk --- stdlib/src/builtin/builtin_list.mojo | 8 ----- stdlib/src/builtin/range.mojo | 40 +++++++------------------ stdlib/src/collections/dict.mojo | 12 ++------ stdlib/src/collections/inline_list.mojo | 4 --- stdlib/src/collections/list.mojo | 4 --- stdlib/src/collections/vector.mojo | 4 --- stdlib/src/python/python_object.mojo | 4 --- stdlib/src/utils/span.mojo | 4 --- stdlib/src/utils/string_slice.mojo | 4 --- 9 files changed, 13 insertions(+), 71 deletions(-) diff --git a/stdlib/src/builtin/builtin_list.mojo b/stdlib/src/builtin/builtin_list.mojo index f7fb994aba..9ea758583d 100644 --- a/stdlib/src/builtin/builtin_list.mojo +++ b/stdlib/src/builtin/builtin_list.mojo @@ -146,10 +146,6 @@ struct _VariadicListIter[type: AnyTrivialRegType]: fn __len__(self) -> Int: return len(self.src) - self.index - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - @register_passable("trivial") struct VariadicList[type: AnyTrivialRegType](Sized): @@ -261,10 +257,6 @@ struct _VariadicListMemIter[ fn __len__(self) -> Int: return len(self.src[]) - self.index - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - # Helper to compute the union of two origins: # TODO: parametric aliases would be nice. diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 58dfd5e1da..78d61cd79a 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -88,9 +88,7 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): fn __reversed__(self) -> _StridedRange: return range(self.end - 1, -1, -1) - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -126,9 +124,7 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): fn __reversed__(self) -> _StridedRange: return range(self.end - 1, self.start - 1, -1) - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -157,9 +153,7 @@ struct _StridedRangeIterator(Sized): fn __has_next__(self) -> Bool: return self.__len__() > 0 - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -219,9 +213,7 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): var step = -self.step return range(start, end, step) - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @always_inline @@ -376,9 +368,7 @@ struct _UIntZeroStartingRange(UIntSized): debug_assert(idx < self.__len__(), "index out of range") return idx - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -402,9 +392,7 @@ struct _UIntStridedRangeIterator(UIntSized): fn __has_next__(self) -> Bool: return self.__len__() > 0 - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -457,9 +445,7 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): debug_assert(idx < self.__len__(), "index out of range") return self.start + idx * self.step - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @always_inline @@ -535,9 +521,7 @@ struct _ZeroStartingScalarRange[type: DType]: ]() return range(self.end - 1, Scalar[type](-1), Scalar[type](-1)) - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -573,9 +557,7 @@ struct _SequentialScalarRange[type: DType]: fn __reversed__(self) -> _StridedRange: return range(self.end - 1, self.start - 1, -1) - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -602,9 +584,7 @@ struct _StridedScalarRangeIterator[type: DType]: self.start += self.step return result - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index ed92e96c2a..c3e23560dd 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -113,9 +113,7 @@ struct _DictEntryIter[ fn __len__(self) -> Int: return len(self.src[]) - self.seen - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -155,9 +153,7 @@ struct _DictKeyIter[ fn __len__(self) -> Int: return self.iter.__len__() - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value @@ -209,9 +205,7 @@ struct _DictValueIter[ fn __len__(self) -> Int: return self.iter.__len__() - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() + @value diff --git a/stdlib/src/collections/inline_list.mojo b/stdlib/src/collections/inline_list.mojo index d9b6e7d8d4..0922999700 100644 --- a/stdlib/src/collections/inline_list.mojo +++ b/stdlib/src/collections/inline_list.mojo @@ -74,10 +74,6 @@ struct _InlineListIter[ else: return self.index - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - # TODO: Provide a smarter default for the capacity. struct InlineList[ElementType: CollectionElementNew, capacity: Int = 16](Sized): diff --git a/stdlib/src/collections/list.mojo b/stdlib/src/collections/list.mojo index 7cb2863591..b849766a9e 100644 --- a/stdlib/src/collections/list.mojo +++ b/stdlib/src/collections/list.mojo @@ -82,10 +82,6 @@ struct _ListIter[ else: return self.index - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - struct List[T: CollectionElement, hint_trivial_type: Bool = False]( CollectionElement, CollectionElementNew, Sized, Boolable diff --git a/stdlib/src/collections/vector.mojo b/stdlib/src/collections/vector.mojo index 1e6bbb1a94..b371c7ec05 100644 --- a/stdlib/src/collections/vector.mojo +++ b/stdlib/src/collections/vector.mojo @@ -52,10 +52,6 @@ struct _VecIter[ fn __len__(self) -> Int: return self.size - self.i - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - # ===----------------------------------------------------------------------===# # InlinedFixedVector diff --git a/stdlib/src/python/python_object.mojo b/stdlib/src/python/python_object.mojo index 7795ff619d..05397a1c75 100644 --- a/stdlib/src/python/python_object.mojo +++ b/stdlib/src/python/python_object.mojo @@ -119,10 +119,6 @@ struct _PyIter(Sized): else: return 1 - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - @register_passable struct TypedPythonObject[type_hint: StringLiteral]( diff --git a/stdlib/src/utils/span.mojo b/stdlib/src/utils/span.mojo index d91ff185db..af417ee09f 100644 --- a/stdlib/src/utils/span.mojo +++ b/stdlib/src/utils/span.mojo @@ -90,10 +90,6 @@ struct _SpanIter[ else: return self.index - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - @value struct Span[ diff --git a/stdlib/src/utils/string_slice.mojo b/stdlib/src/utils/string_slice.mojo index 4965f6a869..e48da12331 100644 --- a/stdlib/src/utils/string_slice.mojo +++ b/stdlib/src/utils/string_slice.mojo @@ -240,10 +240,6 @@ struct _StringSliceIter[ else: return self.index - self.continuation_bytes - @always_inline - fn __bool__(self) -> Bool: - return self.__has_next__() - @value struct StringSlice[is_mutable: Bool, //, origin: Origin[is_mutable].type,]( From 733a6004adc31b4401896647e4d0743f6206d0d8 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 15 Nov 2024 14:14:58 -0300 Subject: [PATCH 14/36] mojo format Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 20 -------------------- stdlib/src/collections/dict.mojo | 6 ------ 2 files changed, 26 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index cbdd095efb..71512c78ad 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -89,8 +89,6 @@ struct _ZeroStartingRange(Sized, ReversibleRange, _IntIterable): return range(self.end - 1, -1, -1) - - @value @register_passable("trivial") struct _SequentialRange(Sized, ReversibleRange, _IntIterable): @@ -125,8 +123,6 @@ struct _SequentialRange(Sized, ReversibleRange, _IntIterable): return range(self.end - 1, self.start - 1, -1) - - @value @register_passable("trivial") struct _StridedRangeIterator(Sized): @@ -154,8 +150,6 @@ struct _StridedRangeIterator(Sized): return self.__len__() > 0 - - @value @register_passable("trivial") struct _StridedRange(Sized, ReversibleRange, _StridedIterable): @@ -214,8 +208,6 @@ struct _StridedRange(Sized, ReversibleRange, _StridedIterable): return range(start, end, step) - - @always_inline fn range[type: Intable](end: type) -> _ZeroStartingRange: """Constructs a [0; end) Range. @@ -369,8 +361,6 @@ struct _UIntZeroStartingRange(UIntSized): return idx - - @value @register_passable("trivial") struct _UIntStridedRangeIterator(UIntSized): @@ -393,8 +383,6 @@ struct _UIntStridedRangeIterator(UIntSized): return self.__len__() > 0 - - @value @register_passable("trivial") struct _UIntStridedRange(UIntSized, _UIntStridedIterable): @@ -446,8 +434,6 @@ struct _UIntStridedRange(UIntSized, _UIntStridedIterable): return self.start + idx * self.step - - @always_inline fn range(end: UInt) -> _UIntZeroStartingRange: """Constructs a [0; end) Range. @@ -522,8 +508,6 @@ struct _ZeroStartingScalarRange[type: DType]: return range(self.end - 1, Scalar[type](-1), Scalar[type](-1)) - - @value @register_passable("trivial") struct _SequentialScalarRange[type: DType]: @@ -558,8 +542,6 @@ struct _SequentialScalarRange[type: DType]: return range(self.end - 1, self.start - 1, -1) - - @value @register_passable("trivial") struct _StridedScalarRangeIterator[type: DType]: @@ -585,8 +567,6 @@ struct _StridedScalarRangeIterator[type: DType]: return result - - @value @register_passable("trivial") struct _StridedScalarRange[type: DType]: diff --git a/stdlib/src/collections/dict.mojo b/stdlib/src/collections/dict.mojo index 0fd8b8755b..bd9cdb5687 100644 --- a/stdlib/src/collections/dict.mojo +++ b/stdlib/src/collections/dict.mojo @@ -114,8 +114,6 @@ struct _DictEntryIter[ return len(self.src[]) - self.seen - - @value struct _DictKeyIter[ dict_mutability: Bool, //, @@ -154,8 +152,6 @@ struct _DictKeyIter[ return self.iter.__len__() - - @value struct _DictValueIter[ dict_mutability: Bool, //, @@ -206,8 +202,6 @@ struct _DictValueIter[ return self.iter.__len__() - - @value struct DictEntry[K: KeyElement, V: CollectionElement]( CollectionElement, CollectionElementNew From aba3216483ae1e07a32649a208401caac93f0450 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 15 Nov 2024 14:19:08 -0300 Subject: [PATCH 15/36] fix remove use of bool Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 71512c78ad..4d515c5d42 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -814,7 +814,7 @@ fn next[T: DType](inout value: _ZeroStartingScalarRange[T]) -> Scalar[T]: Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -830,7 +830,7 @@ fn next[T: DType](inout value: _SequentialScalarRange[T]) -> Scalar[T]: Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -846,7 +846,7 @@ fn next[T: DType](inout value: _StridedScalarRangeIterator[T]) -> Scalar[T]: Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -859,7 +859,7 @@ fn next(inout value: _UIntZeroStartingRange) -> UInt: Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -872,7 +872,7 @@ fn next(inout value: _UIntStridedRangeIterator) -> UInt: Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -891,7 +891,7 @@ fn next[ Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -912,7 +912,7 @@ fn next[ Returns: The iterator of the dict values. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() @@ -933,7 +933,7 @@ fn next[ Returns: The iterator of the dict items. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") output = rebind[__type_of(output)](value.__next__()) @@ -947,5 +947,5 @@ fn next(inout value: _StringSliceIter) -> StringSlice[__type_of(value).origin]: Returns: The type's Iterator. """ - debug_assert(bool(value), "iterator has no next value to yield") + debug_assert(value.__has_next__(), "iterator has no next value to yield") return value.__next__() From 45b719dbfb98ec3bc44db5674d16fa0f464bc102 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 15 Nov 2024 14:30:17 -0300 Subject: [PATCH 16/36] fix the todo items to make them realistic Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 4d515c5d42..dddf82e54f 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -645,31 +645,41 @@ trait _Iterator: fn __iter__(self) -> Self: ... + fn __has_next__(self) -> Bool: + ... -# TODO: this is the goal -# trait _Iterator[T: AnyType]: -# fn __iter__(self) -> Self: -# ... -# fn __next__(inout self) -> T: +# TODO: this is the goal +# fn __next__(inout self) -> ref [origin]T: # ... -# fn __has_next__(self) -> Bool: -# ... # fn __bool__(self) -> Bool: # return self.__has_next__() # trait _Iterable[T: AnyType]: -# fn __iter__(ref [_]self) -> _Iterator[T]: +# fn __iter__[ +# is_mutable: Bool, origin: Origin[is_mutable].type +# ](ref [_]self) -> _Iterator[T, origin]: # ... -# fn iter[T: AnyType, I: _Iterable[T]](ref [_]value: I) -> _Iterator[T]: -# return value.__iter__() +# fn iter[ +# is_mutable: Bool, +# origin: Origin[is_mutable].type, +# T: AnyType, +# I: _Iterable[T], +# ](ref [_]value: I) -> _Iterator[T, origin]: +# return value.__iter__[is_mutable, origin]() + -# fn next[T: AnyType, I: _Iterable[T]](value: I) -> T: +# fn next[ +# is_mutable: Bool, +# origin: Origin[is_mutable].type, +# T: AnyType, +# I: _Iterable[T], +# ](value: I) -> T: # debug_assert(bool(value), "iterator has no next value to yield") # return value.__next__() From fb5f04e330f3f83187efa5c2de6f0efa35b95840 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 15 Nov 2024 14:37:45 -0300 Subject: [PATCH 17/36] fix detail Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index dddf82e54f..678d0eb551 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -678,8 +678,8 @@ trait _Iterator: # is_mutable: Bool, # origin: Origin[is_mutable].type, # T: AnyType, -# I: _Iterable[T], -# ](value: I) -> T: +# I: _Iterator[T, origin], +# ](value: I) -> ref [origin]T: # debug_assert(bool(value), "iterator has no next value to yield") # return value.__next__() From 7b02d0a2f1a9f982941f7ed6485df2e14b3539fc Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Thu, 21 Nov 2024 18:46:06 -0300 Subject: [PATCH 18/36] add iter and reserved explicitly to string, stringliteral, and stringslice tests Signed-off-by: martinvuyk --- stdlib/src/builtin/string_literal.mojo | 2 +- stdlib/src/collections/string.mojo | 2 +- stdlib/src/utils/string_slice.mojo | 4 +- stdlib/test/builtin/test_string_literal.mojo | 41 +++++++++++++++----- stdlib/test/collections/test_string.mojo | 10 ++--- stdlib/test/utils/test_string_slice.mojo | 35 +++++++++++++++++ 6 files changed, 75 insertions(+), 19 deletions(-) diff --git a/stdlib/src/builtin/string_literal.mojo b/stdlib/src/builtin/string_literal.mojo index a99a739c16..abf8bb5f0b 100644 --- a/stdlib/src/builtin/string_literal.mojo +++ b/stdlib/src/builtin/string_literal.mojo @@ -399,7 +399,7 @@ struct StringLiteral( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: """Iterate backwards over the string unicode characters. Returns: diff --git a/stdlib/src/collections/string.mojo b/stdlib/src/collections/string.mojo index a45a7c2ff2..363c9a6929 100644 --- a/stdlib/src/collections/string.mojo +++ b/stdlib/src/collections/string.mojo @@ -1281,7 +1281,7 @@ struct String( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: """Iterate backwards over the string unicode characters. Returns: diff --git a/stdlib/src/utils/string_slice.mojo b/stdlib/src/utils/string_slice.mojo index 21fc4c418f..62ec51878b 100644 --- a/stdlib/src/utils/string_slice.mojo +++ b/stdlib/src/utils/string_slice.mojo @@ -539,7 +539,7 @@ struct StringSlice[is_mutable: Bool, //, origin: Origin[is_mutable].type,]( unsafe_pointer=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: """Iterate backwards over the string unicode characters. Returns: @@ -1053,7 +1053,7 @@ trait Stringlike: """ ... - fn __reversed__(ref [_]self) -> _StringSliceIter[__origin_of(self), False]: + fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: """Iterate backwards over the string unicode characters. Returns: diff --git a/stdlib/test/builtin/test_string_literal.mojo b/stdlib/test/builtin/test_string_literal.mojo index 1e4ca44832..71c5853ba2 100644 --- a/stdlib/test/builtin/test_string_literal.mojo +++ b/stdlib/test/builtin/test_string_literal.mojo @@ -244,16 +244,37 @@ def test_isupper(): def test_iter(): - # Test iterating over a string - var s = "one" - var i = 0 - for c in s: - if i == 0: - assert_equal(c, "o") - elif i == 1: - assert_equal(c, "n") - elif i == 2: - assert_equal(c, "e") + vs = "123" + + # Borrow immutably + fn conc(vs: StringLiteral) -> String: + var c = String("") + for v in iter(vs): + c += v + return c + + assert_equal(123, atol(conc(vs))) + + concat = String("") + for v in reversed(vs): + concat += v + assert_equal(321, atol(concat)) + + idx = -1 + vs = "mojo🔥" + for item in vs: + idx += 1 + if idx == 0: + assert_equal("m", item) + elif idx == 1: + assert_equal("o", item) + elif idx == 2: + assert_equal("j", item) + elif idx == 3: + assert_equal("o", item) + elif idx == 4: + assert_equal("🔥", item) + assert_equal(4, idx) def test_layout(): diff --git a/stdlib/test/collections/test_string.mojo b/stdlib/test/collections/test_string.mojo index d02ad51563..84c881c97b 100644 --- a/stdlib/test/collections/test_string.mojo +++ b/stdlib/test/collections/test_string.mojo @@ -1244,20 +1244,20 @@ def test_indexing(): assert_equal(a[2], "c") -def test_string_iter(): +def test_iter(): var vs = String("123") # Borrow immutably fn conc(vs: String) -> String: var c = String("") - for v in vs: + for v in iter(vs): c += v return c assert_equal(123, atol(conc(vs))) concat = String("") - for v in vs.__reversed__(): + for v in reversed(vs): concat += v assert_equal(321, atol(concat)) @@ -1327,7 +1327,7 @@ def test_string_iter(): assert_equal(amnt_characters, items_amount_characters[item_idx]) var concat = String("") - for v in item.__reversed__(): + for v in reversed(item): concat += v assert_equal(rev[item_idx], concat) item_idx += 1 @@ -1634,7 +1634,7 @@ def main(): test_intable() test_string_mul() test_indexing() - test_string_iter() + test_iter() test_format_args() test_format_conversion_flags() test_isdigit() diff --git a/stdlib/test/utils/test_string_slice.mojo b/stdlib/test/utils/test_string_slice.mojo index 19efdc1e0e..2e65601816 100644 --- a/stdlib/test/utils/test_string_slice.mojo +++ b/stdlib/test/utils/test_string_slice.mojo @@ -487,6 +487,40 @@ def test_splitlines(): _assert_equal(s.splitlines(keepends=True), items) +def test_iter(): + vs = "123" + + # Borrow immutably + fn conc(vs: StringLiteral) -> String: + var c = String("") + for v in iter(vs): + c += v + return c + + assert_equal(123, atol(conc(vs))) + + concat = String("") + for v in reversed(vs): + concat += v + assert_equal(321, atol(concat)) + + idx = -1 + vs = "mojo🔥" + for item in vs: + idx += 1 + if idx == 0: + assert_equal("m", item) + elif idx == 1: + assert_equal("o", item) + elif idx == 2: + assert_equal("j", item) + elif idx == 3: + assert_equal("o", item) + elif idx == 4: + assert_equal("🔥", item) + assert_equal(4, idx) + + fn main() raises: test_string_literal_byte_span() test_string_byte_span() @@ -505,3 +539,4 @@ fn main() raises: test_combination_10_good_10_bad_utf8_sequences() test_count_utf8_continuation_bytes() test_splitlines() + test_iter() From 0ee6e6b2dd027d31d73c4afd8bc0b57be30b108e Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Thu, 21 Nov 2024 19:14:56 -0300 Subject: [PATCH 19/36] fix detail in string_slice test Signed-off-by: martinvuyk --- stdlib/test/utils/test_string_slice.mojo | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/stdlib/test/utils/test_string_slice.mojo b/stdlib/test/utils/test_string_slice.mojo index 2e65601816..1a47a96a5b 100644 --- a/stdlib/test/utils/test_string_slice.mojo +++ b/stdlib/test/utils/test_string_slice.mojo @@ -488,10 +488,10 @@ def test_splitlines(): def test_iter(): - vs = "123" + vs = StringSlice("123") # Borrow immutably - fn conc(vs: StringLiteral) -> String: + fn conc(vs: StringSlice) -> String: var c = String("") for v in iter(vs): c += v @@ -505,8 +505,7 @@ def test_iter(): assert_equal(321, atol(concat)) idx = -1 - vs = "mojo🔥" - for item in vs: + for item in StringSlice("mojo🔥"): idx += 1 if idx == 0: assert_equal("m", item) From be2dfd62ee0f4c962864611175336d590b6bc682 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 9 Dec 2024 21:25:33 -0300 Subject: [PATCH 20/36] fix details after merge Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 33 ++++++++++++++++++++++---- stdlib/src/builtin/reversed.mojo | 38 ++++++++++++++++++++++++------ stdlib/src/utils/string_slice.mojo | 18 +------------- stdlib/test/python/my_module.py | 3 ++- 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 3bc6b6c96d..960ed3c55b 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -25,7 +25,7 @@ from python import ( ) # TODO: remove this and fixup downstream imports from utils._select import _select_register_value as select -from utils.string_slice import StringSlice, _StringSliceIter, Stringlike +from utils.string_slice import StringSlice, _StringSliceIter from collections.list import _ListIter from collections.dict import ( Dict, @@ -802,12 +802,9 @@ fn iter[ @always_inline -fn iter[T: Stringlike](ref [_]value: T) -> _StringSliceIter[__origin_of(value)]: +fn iter(ref value: String) -> _StringSliceIter[__origin_of(value)]: """Return an iterator. - Parameters: - T: The type that the iterator yields. - Args: value: The iterable value. @@ -817,6 +814,32 @@ fn iter[T: Stringlike](ref [_]value: T) -> _StringSliceIter[__origin_of(value)]: return value.__iter__() +@always_inline +fn iter(value: StringLiteral) -> _StringSliceIter[StaticConstantOrigin]: + """Return an iterator. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + return rebind[_StringSliceIter[StaticConstantOrigin]](value.__iter__()) + + +@always_inline +fn iter(value: StringSlice) -> _StringSliceIter[__type_of(value).origin]: + """Return an iterator. + + Args: + value: The iterable value. + + Returns: + The type's Iterator. + """ + return rebind[_StringSliceIter[__type_of(value).origin]](value.__iter__()) + + fn next[T: DType](inout value: _ZeroStartingScalarRange[T]) -> Scalar[T]: """Return an iterator. diff --git a/stdlib/src/builtin/reversed.mojo b/stdlib/src/builtin/reversed.mojo index 399aa1f859..e3044e3916 100644 --- a/stdlib/src/builtin/reversed.mojo +++ b/stdlib/src/builtin/reversed.mojo @@ -20,7 +20,7 @@ from collections.deque import _DequeIter from collections.dict import _DictEntryIter, _DictKeyIter, _DictValueIter from collections.list import _ListIter from memory.span import Span, _SpanIter -from utils.string_slice import _StringSliceIter, StringSlice, Stringlike +from utils.string_slice import _StringSliceIter, StringSlice from .range import _StridedRange @@ -207,15 +207,13 @@ fn reversed[ return value.__reversed__() +alias _S = _StringSliceIter[_, forward=False] + + @always_inline -fn reversed[ - T: Stringlike -](ref [_]value: T) -> _StringSliceIter[__origin_of(value), forward=False]: +fn reversed(ref value: String) -> _S[__origin_of(value)]: """Return a reversed iterator. - Parameters: - T: The Stringlike type. - Args: value: The iterable value. @@ -223,3 +221,29 @@ fn reversed[ The type's reversed Iterator. """ return value.__reversed__() + + +@always_inline +fn reversed(value: StringLiteral) -> _S[StaticConstantOrigin]: + """Return a reversed iterator. + + Args: + value: The iterable value. + + Returns: + The type's reversed Iterator. + """ + return rebind[_S[StaticConstantOrigin]](value.__reversed__()) + + +@always_inline +fn reversed(value: StringSlice) -> _S[__type_of(value).origin]: + """Return a reversed iterator. + + Args: + value: The iterable value. + + Returns: + The type's reversed Iterator. + """ + return rebind[_S[__type_of(value).origin]](value.__reversed__()) diff --git a/stdlib/src/utils/string_slice.mojo b/stdlib/src/utils/string_slice.mojo index a61ed5d13a..780c41ea79 100644 --- a/stdlib/src/utils/string_slice.mojo +++ b/stdlib/src/utils/string_slice.mojo @@ -521,7 +521,7 @@ struct StringSlice[is_mutable: Bool, //, origin: Origin[is_mutable]]( self.unsafe_ptr(), rhs.unsafe_ptr(), min(len1, len2) ) - fn __iter__(ref [_]self) -> _StringSliceIter[__origin_of(self)]: + fn __iter__(ref self) -> _StringSliceIter[__origin_of(self)]: """Iterate over the string unicode characters. Returns: @@ -1121,22 +1121,6 @@ struct StringSlice[is_mutable: Bool, //, origin: Origin[is_mutable]]( # Utils # ===-----------------------------------------------------------------------===# - fn __iter__(ref [_]self) -> _StringSliceIter[__origin_of(self)]: - """Iterate over the string unicode characters. - - Returns: - An iterator of references to the string unicode characters. - """ - ... - - fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: - """Iterate backwards over the string unicode characters. - - Returns: - A reversed iterator of references to the string unicode characters. - """ - ... - fn _to_string_list[ T: CollectionElement, # TODO(MOCO-1446): Make `T` parameter inferred diff --git a/stdlib/test/python/my_module.py b/stdlib/test/python/my_module.py index 8147b0a382..c78c39556e 100644 --- a/stdlib/test/python/my_module.py +++ b/stdlib/test/python/my_module.py @@ -25,7 +25,8 @@ def __init__(self, bar): class AbstractPerson(ABC): @abstractmethod - def method(self): ... + def method(self): + ... def my_function(name): From 9ec7b45fa9a3da98b6b3e1246f2e8ab45a823e78 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 9 Dec 2024 21:30:07 -0300 Subject: [PATCH 21/36] fix details Signed-off-by: martinvuyk --- stdlib/test/builtin/test_string_literal.mojo | 2 +- stdlib/test/utils/test_string_slice.mojo | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/test/builtin/test_string_literal.mojo b/stdlib/test/builtin/test_string_literal.mojo index f4d5322a71..cb81f8f5dd 100644 --- a/stdlib/test/builtin/test_string_literal.mojo +++ b/stdlib/test/builtin/test_string_literal.mojo @@ -276,7 +276,7 @@ def test_iter(): idx = -1 vs = "mojo🔥" - for item in vs: + for item in iter(vs): idx += 1 if idx == 0: assert_equal("m", item) diff --git a/stdlib/test/utils/test_string_slice.mojo b/stdlib/test/utils/test_string_slice.mojo index 2fa18c44f2..28e340d3b6 100644 --- a/stdlib/test/utils/test_string_slice.mojo +++ b/stdlib/test/utils/test_string_slice.mojo @@ -506,7 +506,7 @@ def test_iter(): assert_equal(321, atol(concat)) idx = -1 - for item in StringSlice("mojo🔥"): + for item in iter(StringSlice("mojo🔥")): idx += 1 if idx == 0: assert_equal("m", item) From 3d1432984d76a2b91423f103750200ffebe25092 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 9 Dec 2024 21:33:15 -0300 Subject: [PATCH 22/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 73 +++++++++----------------------- stdlib/src/builtin/reversed.mojo | 6 +++ 2 files changed, 27 insertions(+), 52 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 960ed3c55b..d1aba0f021 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -646,49 +646,7 @@ fn range[ # ===----------------------------------------------------------------------=== # -trait _Iterator: - fn __iter__(self) -> Self: - ... - - fn __has_next__(self) -> Bool: - ... - - -# TODO: this is the goal -# fn __next__(inout self) -> ref [origin]T: -# ... - - -# fn __bool__(self) -> Bool: -# return self.__has_next__() - - -# trait _Iterable[T: AnyType]: -# fn __iter__[ -# is_mutable: Bool, origin: Origin[is_mutable].type -# ](ref [_]self) -> _Iterator[T, origin]: -# ... - - -# fn iter[ -# is_mutable: Bool, -# origin: Origin[is_mutable].type, -# T: AnyType, -# I: _Iterable[T], -# ](ref [_]value: I) -> _Iterator[T, origin]: -# return value.__iter__[is_mutable, origin]() - - -# fn next[ -# is_mutable: Bool, -# origin: Origin[is_mutable].type, -# T: AnyType, -# I: _Iterator[T, origin], -# ](value: I) -> ref [origin]T: -# debug_assert(bool(value), "iterator has no next value to yield") -# return value.__next__() - - +@always_inline fn iter[T: _Iterator](value: T) -> T: """Get an iterator from the iterator. @@ -704,6 +662,7 @@ fn iter[T: _Iterator](value: T) -> T: return value.__iter__() +@always_inline fn iter[ T: DType ](value: _StridedScalarRange[T]) -> _StridedScalarRangeIterator[T]: @@ -741,6 +700,7 @@ fn iter[ return value.__iter__() +@always_inline fn iter[ K: KeyElement, V: CollectionElement ](ref [_]value: Dict[K, V]) -> _DictKeyIter[K, V, __origin_of(value)]: @@ -759,6 +719,7 @@ fn iter[ return value.__iter__() +@always_inline fn iter[ K: KeyElement, V: CollectionElement ](ref [_]value: _DictValueIter[K, V, *_]) -> _DictValueIter[ @@ -779,6 +740,7 @@ fn iter[ output = rebind[__type_of(output)](value.__iter__()) +@always_inline fn iter[ K: KeyElement, V: CollectionElement, @@ -840,7 +802,8 @@ fn iter(value: StringSlice) -> _StringSliceIter[__type_of(value).origin]: return rebind[_StringSliceIter[__type_of(value).origin]](value.__iter__()) -fn next[T: DType](inout value: _ZeroStartingScalarRange[T]) -> Scalar[T]: +@always_inline +fn next[T: DType](mut value: _ZeroStartingScalarRange[T]) -> Scalar[T]: """Return an iterator. Parameters: @@ -856,7 +819,8 @@ fn next[T: DType](inout value: _ZeroStartingScalarRange[T]) -> Scalar[T]: return value.__next__() -fn next[T: DType](inout value: _SequentialScalarRange[T]) -> Scalar[T]: +@always_inline +fn next[T: DType](mut value: _SequentialScalarRange[T]) -> Scalar[T]: """Return an iterator. Parameters: @@ -872,7 +836,8 @@ fn next[T: DType](inout value: _SequentialScalarRange[T]) -> Scalar[T]: return value.__next__() -fn next[T: DType](inout value: _StridedScalarRangeIterator[T]) -> Scalar[T]: +@always_inline +fn next[T: DType](mut value: _StridedScalarRangeIterator[T]) -> Scalar[T]: """Return an iterator. Parameters: @@ -888,7 +853,8 @@ fn next[T: DType](inout value: _StridedScalarRangeIterator[T]) -> Scalar[T]: return value.__next__() -fn next(inout value: _UIntZeroStartingRange) -> UInt: +@always_inline +fn next(mut value: _UIntZeroStartingRange) -> UInt: """Return an iterator. Args: @@ -901,7 +867,8 @@ fn next(inout value: _UIntZeroStartingRange) -> UInt: return value.__next__() -fn next(inout value: _UIntStridedRangeIterator) -> UInt: +@always_inline +fn next(mut value: _UIntStridedRangeIterator) -> UInt: """Return an iterator. Args: @@ -917,7 +884,7 @@ fn next(inout value: _UIntStridedRangeIterator) -> UInt: @always_inline fn next[ T: CollectionElement -](inout value: _ListIter[T, *_]) -> Pointer[T, __type_of(value).list_origin]: +](mut value: _ListIter[T, *_]) -> Pointer[T, __type_of(value).list_origin]: """Return an iterator. Parameters: @@ -933,9 +900,10 @@ fn next[ return value.__next__() +@always_inline fn next[ K: KeyElement, V: CollectionElement -](inout value: _DictValueIter[K, V, *_]) -> Pointer[ +](mut value: _DictValueIter[K, V, *_]) -> Pointer[ V, __type_of(value).dict_origin ]: """Get an iterator of the input dict values. @@ -954,9 +922,10 @@ fn next[ return value.__next__() +@always_inline fn next[ K: KeyElement, V: CollectionElement -](inout value: _DictEntryIter[K, V, *_]) -> Pointer[ +](mut value: _DictEntryIter[K, V, *_]) -> Pointer[ DictEntry[K, V], __type_of(value).dict_origin ] as output: """Get an iterator of the input dict items. @@ -976,7 +945,7 @@ fn next[ @always_inline -fn next(inout value: _StringSliceIter) -> StringSlice[__type_of(value).origin]: +fn next(mut value: _StringSliceIter) -> StringSlice[__type_of(value).origin]: """Return an iterator. Args: diff --git a/stdlib/src/builtin/reversed.mojo b/stdlib/src/builtin/reversed.mojo index e3044e3916..4d9bb1f02e 100644 --- a/stdlib/src/builtin/reversed.mojo +++ b/stdlib/src/builtin/reversed.mojo @@ -62,6 +62,7 @@ trait ReversibleRange: # ===----------------------------------------------------------------------=== # +@always_inline fn reversed[T: ReversibleRange](value: T) -> _StridedRange: """Get a reversed iterator of the input range. @@ -77,6 +78,7 @@ fn reversed[T: ReversibleRange](value: T) -> _StridedRange: return value.__reversed__() +@always_inline fn reversed[ T: CollectionElement ](ref value: List[T, *_]) -> _ListIter[ @@ -96,6 +98,7 @@ fn reversed[ return value.__reversed__() +@always_inline fn reversed[ T: CollectionElement ](ref value: Deque[T]) -> _DequeIter[T, __origin_of(value), False]: @@ -115,6 +118,7 @@ fn reversed[ return value.__reversed__() +@always_inline fn reversed[ K: KeyElement, V: CollectionElement, @@ -134,6 +138,7 @@ fn reversed[ return value.__reversed__() +@always_inline fn reversed[ K: KeyElement, V: CollectionElement, @@ -159,6 +164,7 @@ fn reversed[ return value.__reversed__() +@always_inline fn reversed[ K: KeyElement, V: CollectionElement, From f60c04ec7febcb2b516d97ee572c39b49e621a7f Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 9 Dec 2024 21:34:44 -0300 Subject: [PATCH 23/36] fix details Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index d1aba0f021..96a550d091 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -646,22 +646,6 @@ fn range[ # ===----------------------------------------------------------------------=== # -@always_inline -fn iter[T: _Iterator](value: T) -> T: - """Get an iterator from the iterator. - - Parameters: - T: The type conforming to _Iterator. - - Args: - value: The value to get the iterator of. - - Returns: - The iterator of the value. - """ - return value.__iter__() - - @always_inline fn iter[ T: DType From 462ce8656e1650cbd11f0f2c8f59c374b8c2378a Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 08:52:13 -0300 Subject: [PATCH 24/36] fix after merge Signed-off-by: martinvuyk --- stdlib/src/collections/string/string.mojo | 9 ++++----- .../src/collections/string/string_slice.mojo | 9 ++++----- .../test/collections/string/test_string.mojo | 20 +++++++++---------- stdlib/test/python/my_module.py | 3 +-- 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index 1b0fbe9a4e..c831ec44a1 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -1063,20 +1063,19 @@ struct String( """ self._iadd[False](other.as_bytes()) - @deprecated("Use `str.chars()` or `str.char_slices()` instead.") fn __iter__(self) -> _StringSliceIter[__origin_of(self)]: - """Iterate over the string, returning immutable references. + """Iterate over the string unicode characters. Returns: - An iterator of references to the string elements. + An iterator of references to the string unicode characters. """ return self.char_slices() fn __reversed__(self) -> _StringSliceIter[__origin_of(self), False]: - """Iterate backwards over the string, returning immutable references. + """Iterate backwards over the string unicode characters. Returns: - A reversed iterator of references to the string elements. + A reversed iterator of references to the string unicode characters. """ return _StringSliceIter[__origin_of(self), forward=False]( ptr=self.unsafe_ptr(), length=self.byte_length() diff --git a/stdlib/src/collections/string/string_slice.mojo b/stdlib/src/collections/string/string_slice.mojo index 820c262621..2f3718055f 100644 --- a/stdlib/src/collections/string/string_slice.mojo +++ b/stdlib/src/collections/string/string_slice.mojo @@ -675,20 +675,19 @@ struct StringSlice[mut: Bool, //, origin: Origin[mut]]( self.unsafe_ptr(), rhs.unsafe_ptr(), min(len1, len2) ) - @deprecated("Use `str.chars()` or `str.char_slices()` instead.") fn __iter__(self) -> _StringSliceIter[origin]: - """Iterate over the string, returning immutable references. + """Iterate over the string unicode characters. Returns: - An iterator of references to the string elements. + An iterator of references to the string unicode characters. """ return self.char_slices() fn __reversed__(self) -> _StringSliceIter[origin, False]: - """Iterate backwards over the string, returning immutable references. + """Iterate backwards over the string unicode characters. Returns: - A reversed iterator of references to the string elements. + A reversed iterator of references to the string unicode characters. """ return _StringSliceIter[origin, forward=False]( ptr=self.unsafe_ptr(), length=self.byte_length() diff --git a/stdlib/test/collections/string/test_string.mojo b/stdlib/test/collections/string/test_string.mojo index 0d39db2fa5..dbb64a1c96 100644 --- a/stdlib/test/collections/string/test_string.mojo +++ b/stdlib/test/collections/string/test_string.mojo @@ -1152,22 +1152,22 @@ def test_string_char_slices_iter(): # Borrow immutably fn conc(vs: String) -> String: var c = String("") - for v in vs.char_slices(): + for v in iter(vs): c += v return c assert_equal(123, atol(conc(vs))) concat = String("") - for v in vs.__reversed__(): + for v in reversed(vs): concat += v assert_equal(321, atol(concat)) - for v in vs.char_slices(): + for v in iter(vs): v.unsafe_ptr().origin_cast[mut=True]()[] = ord("1") # Borrow immutably - for v in vs.char_slices(): + for v in iter(vs): concat += v assert_equal(321111, atol(concat)) @@ -1176,19 +1176,19 @@ def test_string_char_slices_iter(): vs = String("mojo🔥") var iterator = vs.char_slices() assert_equal(5, len(iterator)) - var item = iterator.__next__() + var item = next(iterator) assert_equal(String("m"), String(item)) assert_equal(4, len(iterator)) - item = iterator.__next__() + item = next(iterator) assert_equal(String("o"), String(item)) assert_equal(3, len(iterator)) - item = iterator.__next__() + item = next(iterator) assert_equal(String("j"), String(item)) assert_equal(2, len(iterator)) - item = iterator.__next__() + item = next(iterator) assert_equal(String("o"), String(item)) assert_equal(1, len(iterator)) - item = iterator.__next__() + item = next(iterator) assert_equal(String("🔥"), String(item)) assert_equal(0, len(iterator)) @@ -1233,7 +1233,7 @@ def test_string_char_slices_iter(): assert_equal(amnt_characters, items_amount_characters[item_idx]) var concat = String("") - for v in item.__reversed__(): + for v in reversed(item): concat += v assert_equal(rev[item_idx], concat) item_idx += 1 diff --git a/stdlib/test/python/my_module.py b/stdlib/test/python/my_module.py index f8dbe59235..73c34742fd 100644 --- a/stdlib/test/python/my_module.py +++ b/stdlib/test/python/my_module.py @@ -25,8 +25,7 @@ def __init__(self, bar): class AbstractPerson(ABC): @abstractmethod - def method(self): - ... + def method(self): ... def my_function(name): From 30148769aa4910ba9a790ff4669d72fcfe9c06e0 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 08:54:30 -0300 Subject: [PATCH 25/36] fix after merge Signed-off-by: martinvuyk --- stdlib/src/builtin/string_literal.mojo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/src/builtin/string_literal.mojo b/stdlib/src/builtin/string_literal.mojo index 15dcf06714..4a23f21103 100644 --- a/stdlib/src/builtin/string_literal.mojo +++ b/stdlib/src/builtin/string_literal.mojo @@ -439,7 +439,7 @@ struct StringLiteral( """ return self.__str__() - fn __iter__(ref self) -> _StringSliceIter[__origin_of(self)]: + fn __iter__(self) -> _StringSliceIter[StaticConstantOrigin]: """Iterate over the string unicode characters. Returns: @@ -449,7 +449,7 @@ struct StringLiteral( ptr=self.unsafe_ptr(), length=self.byte_length() ) - fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: + fn __reversed__(self) -> _StringSliceIter[StaticConstantOrigin, False]: """Iterate backwards over the string unicode characters. Returns: From dc140956168de1fd98be6dbc5722d980a9290e48 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 08:57:20 -0300 Subject: [PATCH 26/36] fix after merge Signed-off-by: martinvuyk --- stdlib/src/builtin/reversed.mojo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/src/builtin/reversed.mojo b/stdlib/src/builtin/reversed.mojo index dfb8bf7b78..14b7ea0e72 100644 --- a/stdlib/src/builtin/reversed.mojo +++ b/stdlib/src/builtin/reversed.mojo @@ -19,8 +19,8 @@ from collections import Deque, Dict from collections.deque import _DequeIter from collections.dict import _DictEntryIter, _DictKeyIter, _DictValueIter from collections.list import _ListIter +from collections.string.string_slice import _StringSliceIter, StringSlice from memory.span import Span, _SpanIter -from utils.string_slice import _StringSliceIter, StringSlice from .range import _StridedRange From df753dc700e5433e68e0879d99e118c29b96d26d Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 09:01:37 -0300 Subject: [PATCH 27/36] fix after merge Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 21 ++++++++++++--------- stdlib/src/collections/string/string.mojo | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 30b7317b7d..972d446a41 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -706,9 +706,10 @@ fn iter[ @always_inline fn iter[ K: KeyElement, V: CollectionElement -](ref [_]value: _DictValueIter[K, V, *_]) -> _DictValueIter[ - K, V, __type_of(value).dict_origin -] as output: +]( + ref [_]value: _DictValueIter[K, V, *_], + out output: _DictValueIter[K, V, __type_of(value).dict_origin], +): """Get an iterator of the input dict values. Parameters: @@ -728,9 +729,10 @@ fn iter[ fn iter[ K: KeyElement, V: CollectionElement, -](ref [_]value: _DictEntryIter[K, V, *_]) -> _DictEntryIter[ - K, V, __type_of(value).dict_origin -] as output: +]( + ref [_]value: _DictEntryIter[K, V, *_], + out output: DictEntryIter[K, V, __type_of(value).dict_origin], +): """Get an iterator of the input dict items. Parameters: @@ -909,9 +911,10 @@ fn next[ @always_inline fn next[ K: KeyElement, V: CollectionElement -](mut value: _DictEntryIter[K, V, *_]) -> Pointer[ - DictEntry[K, V], __type_of(value).dict_origin -] as output: +]( + mut value: _DictEntryIter[K, V, *_], + out output: Pointer[DictEntry[K, V], __type_of(value).dict_origin], +): """Get an iterator of the input dict items. Parameters: diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index c831ec44a1..890be23a13 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -1063,7 +1063,7 @@ struct String( """ self._iadd[False](other.as_bytes()) - fn __iter__(self) -> _StringSliceIter[__origin_of(self)]: + fn __iter__(ref self) -> _StringSliceIter[__origin_of(self)]: """Iterate over the string unicode characters. Returns: @@ -1071,7 +1071,7 @@ struct String( """ return self.char_slices() - fn __reversed__(self) -> _StringSliceIter[__origin_of(self), False]: + fn __reversed__(ref self) -> _StringSliceIter[__origin_of(self), False]: """Iterate backwards over the string unicode characters. Returns: From 0870a2bd0993585e60164e583f992446e3f2aca3 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 09:40:55 -0300 Subject: [PATCH 28/36] fix after merge Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 2 +- stdlib/src/collections/string/string.mojo | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 972d446a41..40e9fe8536 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -731,7 +731,7 @@ fn iter[ V: CollectionElement, ]( ref [_]value: _DictEntryIter[K, V, *_], - out output: DictEntryIter[K, V, __type_of(value).dict_origin], + out output: _DictEntryIter[K, V, __type_of(value).dict_origin], ): """Get an iterator of the input dict items. diff --git a/stdlib/src/collections/string/string.mojo b/stdlib/src/collections/string/string.mojo index 890be23a13..fb67a7c184 100644 --- a/stdlib/src/collections/string/string.mojo +++ b/stdlib/src/collections/string/string.mojo @@ -1274,7 +1274,7 @@ struct String( """ return self.as_string_slice().chars() - fn char_slices(self) -> _StringSliceIter[__origin_of(self)]: + fn char_slices(ref self) -> _StringSliceIter[__origin_of(self)]: """Returns an iterator over single-character slices of this string. Each returned slice points to a single Unicode codepoint encoded in the From 6ea3ff4014d61ec226837fca505831a9b7113406 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 09:47:31 -0300 Subject: [PATCH 29/36] fix after merge Signed-off-by: martinvuyk --- stdlib/src/builtin/range.mojo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/src/builtin/range.mojo b/stdlib/src/builtin/range.mojo index 40e9fe8536..d91f748a6f 100644 --- a/stdlib/src/builtin/range.mojo +++ b/stdlib/src/builtin/range.mojo @@ -25,7 +25,7 @@ from python import ( ) # TODO: remove this and fixup downstream imports from utils._select import _select_register_value as select -from utils.string_slice import StringSlice, _StringSliceIter +from collections.string.string_slice import StringSlice, _StringSliceIter from collections.list import _ListIter from collections.dict import ( Dict, From 1989e09ca3d9080044cd4706863cd2cf525e6699 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 09:59:07 -0300 Subject: [PATCH 30/36] fix details Signed-off-by: martinvuyk --- stdlib/test/builtin/test_string_literal.mojo | 31 ++++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/stdlib/test/builtin/test_string_literal.mojo b/stdlib/test/builtin/test_string_literal.mojo index b407166216..315452279b 100644 --- a/stdlib/test/builtin/test_string_literal.mojo +++ b/stdlib/test/builtin/test_string_literal.mojo @@ -286,20 +286,25 @@ def test_iter(): concat += v assert_equal(321, atol(concat)) - idx = -1 + var idx = -1 vs = "mojo🔥" - for item in iter(vs): - idx += 1 - if idx == 0: - assert_equal("m", item) - elif idx == 1: - assert_equal("o", item) - elif idx == 2: - assert_equal("j", item) - elif idx == 3: - assert_equal("o", item) - elif idx == 4: - assert_equal("🔥", item) + var iterator = vs.char_slices() + assert_equal(5, len(iterator)) + var item = next(iterator) + assert_equal(String("m"), String(item)) + assert_equal(4, len(iterator)) + item = next(iterator) + assert_equal(String("o"), String(item)) + assert_equal(3, len(iterator)) + item = next(iterator) + assert_equal(String("j"), String(item)) + assert_equal(2, len(iterator)) + item = next(iterator) + assert_equal(String("o"), String(item)) + assert_equal(1, len(iterator)) + item = next(iterator) + assert_equal(String("🔥"), String(item)) + assert_equal(0, len(iterator)) assert_equal(4, idx) From d0e06017c2b5103aa016f3ae2087bf189ac001ec Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Mon, 3 Feb 2025 10:02:40 -0300 Subject: [PATCH 31/36] fix detail Signed-off-by: martinvuyk --- stdlib/test/builtin/test_string_literal.mojo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/test/builtin/test_string_literal.mojo b/stdlib/test/builtin/test_string_literal.mojo index 315452279b..d68841a417 100644 --- a/stdlib/test/builtin/test_string_literal.mojo +++ b/stdlib/test/builtin/test_string_literal.mojo @@ -288,7 +288,7 @@ def test_iter(): var idx = -1 vs = "mojo🔥" - var iterator = vs.char_slices() + var iterator = vs.__iter__() assert_equal(5, len(iterator)) var item = next(iterator) assert_equal(String("m"), String(item)) From f11594a5ad8ccf2f647f9342a7f132e0f3edb245 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 17:20:44 -0300 Subject: [PATCH 32/36] change _StringSliceIter to CodepointSliceIter Signed-off-by: martinvuyk --- mojo/stdlib/src/builtin/range.mojo | 14 +++++++------- mojo/stdlib/src/builtin/reversed.mojo | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mojo/stdlib/src/builtin/range.mojo b/mojo/stdlib/src/builtin/range.mojo index d91f748a6f..78b393a218 100644 --- a/mojo/stdlib/src/builtin/range.mojo +++ b/mojo/stdlib/src/builtin/range.mojo @@ -25,7 +25,7 @@ from python import ( ) # TODO: remove this and fixup downstream imports from utils._select import _select_register_value as select -from collections.string.string_slice import StringSlice, _StringSliceIter +from collections.string.string_slice import StringSlice, CodepointSliceIter from collections.list import _ListIter from collections.dict import ( Dict, @@ -750,7 +750,7 @@ fn iter[ @always_inline -fn iter(ref value: String) -> _StringSliceIter[__origin_of(value)]: +fn iter(ref value: String) -> CodepointSliceIter[__origin_of(value)]: """Return an iterator. Args: @@ -763,7 +763,7 @@ fn iter(ref value: String) -> _StringSliceIter[__origin_of(value)]: @always_inline -fn iter(value: StringLiteral) -> _StringSliceIter[StaticConstantOrigin]: +fn iter(value: StringLiteral) -> CodepointSliceIter[StaticConstantOrigin]: """Return an iterator. Args: @@ -772,11 +772,11 @@ fn iter(value: StringLiteral) -> _StringSliceIter[StaticConstantOrigin]: Returns: The type's Iterator. """ - return rebind[_StringSliceIter[StaticConstantOrigin]](value.__iter__()) + return rebind[CodepointSliceIter[StaticConstantOrigin]](value.__iter__()) @always_inline -fn iter(value: StringSlice) -> _StringSliceIter[__type_of(value).origin]: +fn iter(value: StringSlice) -> CodepointSliceIter[__type_of(value).origin]: """Return an iterator. Args: @@ -785,7 +785,7 @@ fn iter(value: StringSlice) -> _StringSliceIter[__type_of(value).origin]: Returns: The type's Iterator. """ - return rebind[_StringSliceIter[__type_of(value).origin]](value.__iter__()) + return rebind[CodepointSliceIter[__type_of(value).origin]](value.__iter__()) @always_inline @@ -932,7 +932,7 @@ fn next[ @always_inline -fn next(mut value: _StringSliceIter) -> StringSlice[__type_of(value).origin]: +fn next(mut value: CodepointSliceIter) -> StringSlice[__type_of(value).origin]: """Return an iterator. Args: diff --git a/mojo/stdlib/src/builtin/reversed.mojo b/mojo/stdlib/src/builtin/reversed.mojo index 238e76dc01..fda8fb7b97 100644 --- a/mojo/stdlib/src/builtin/reversed.mojo +++ b/mojo/stdlib/src/builtin/reversed.mojo @@ -19,7 +19,7 @@ from collections import Deque, Dict from collections.deque import _DequeIter from collections.dict import _DictEntryIter, _DictKeyIter, _DictValueIter from collections.list import _ListIter -from collections.string.string_slice import _StringSliceIter, StringSlice +from collections.string.string_slice import CodepointSliceIter, StringSlice from memory.span import Span, _SpanIter @@ -214,7 +214,7 @@ fn reversed[ return value.__reversed__() -alias _S = _StringSliceIter[_, forward=False] +alias _S = CodepointSliceIter[_, forward=False] @always_inline From d17b1394a0cb6f3a263ed20f181debe0ed9e2a58 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 17:27:07 -0300 Subject: [PATCH 33/36] fix detail with origins Signed-off-by: martinvuyk --- mojo/stdlib/src/collections/string/string.mojo | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mojo/stdlib/src/collections/string/string.mojo b/mojo/stdlib/src/collections/string/string.mojo index 99785869ae..8f34e808cb 100644 --- a/mojo/stdlib/src/collections/string/string.mojo +++ b/mojo/stdlib/src/collections/string/string.mojo @@ -1034,21 +1034,23 @@ struct String( """ self._iadd(other.as_bytes()) - fn __iter__(self) -> CodepointSliceIter[__origin_of(self)]: + fn __iter__(ref self) -> CodepointSliceIter[__origin_of(self)]: """Iterate over the string unicode characters. Returns: An iterator of references to the string unicode characters. """ - return self.codepoint_slices() + return CodepointSliceIter[__origin_of(self)](self.as_string_slice()) - fn __reversed__(self) -> CodepointSliceIter[__origin_of(self), False]: + fn __reversed__(ref self) -> CodepointSliceIter[__origin_of(self), False]: """Iterate backwards over the string unicode characters. Returns: A reversed iterator of references to the string unicode characters. """ - return CodepointSliceIter[__origin_of(self), forward=False](self) + return CodepointSliceIter[__origin_of(self), forward=False]( + self.as_string_slice() + ) # ===------------------------------------------------------------------=== # # Trait implementations From 5368b18af51ae38950241de65f1528dc219696c3 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 17:49:57 -0300 Subject: [PATCH 34/36] fix details Signed-off-by: martinvuyk --- mojo/stdlib/src/builtin/range.mojo | 55 ++++++------------- mojo/stdlib/src/builtin/reversed.mojo | 24 +++++++- .../test/builtin/test_string_literal.mojo | 2 +- 3 files changed, 40 insertions(+), 41 deletions(-) diff --git a/mojo/stdlib/src/builtin/range.mojo b/mojo/stdlib/src/builtin/range.mojo index 78b393a218..f0d08e5b67 100644 --- a/mojo/stdlib/src/builtin/range.mojo +++ b/mojo/stdlib/src/builtin/range.mojo @@ -686,19 +686,23 @@ fn iter[ @always_inline fn iter[ - K: KeyElement, V: CollectionElement -](ref [_]value: Dict[K, V]) -> _DictKeyIter[K, V, __origin_of(value)]: - """Get an iterator of the input dict. + T: CollectionElement +](value: Span[T]) -> _SpanIter[ + T, + origin, + address_space=address_space, + alignment=alignment, +]: + """Return an iterator. Parameters: - K: The type of the keys in the dict. - V: The type of the values in the dict. + T: The type that the iterator yields. Args: - value: The dict to get the iterator of. + value: The iterable value. Returns: - The iterator of the dict keys. + The type's Iterator. """ return value.__iter__() @@ -706,47 +710,20 @@ fn iter[ @always_inline fn iter[ K: KeyElement, V: CollectionElement -]( - ref [_]value: _DictValueIter[K, V, *_], - out output: _DictValueIter[K, V, __type_of(value).dict_origin], -): - """Get an iterator of the input dict values. - - Parameters: - K: The type of the keys in the dict. - V: The type of the values in the dict. - - Args: - value: The dict values to get the iterator of. - - Returns: - The iterator of the dict values. - """ - output = rebind[__type_of(output)](value.__iter__()) - - -@always_inline -fn iter[ - K: KeyElement, - V: CollectionElement, -]( - ref [_]value: _DictEntryIter[K, V, *_], - out output: _DictEntryIter[K, V, __type_of(value).dict_origin], -): - """Get an iterator of the input dict items. +](ref [_]value: Dict[K, V]) -> _DictKeyIter[K, V, __origin_of(value)]: + """Get an iterator of the input dict. Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. Args: - value: The dict items to get the iterator of. + value: The dict to get the iterator of. Returns: - The iterator of the dict items. + The iterator of the dict keys. """ - var src = value.src - output = __type_of(output)(src[]._reserved() - 1, 0, src) + return value.__iter__() @always_inline diff --git a/mojo/stdlib/src/builtin/reversed.mojo b/mojo/stdlib/src/builtin/reversed.mojo index fda8fb7b97..46e3f9bdd7 100644 --- a/mojo/stdlib/src/builtin/reversed.mojo +++ b/mojo/stdlib/src/builtin/reversed.mojo @@ -67,6 +67,8 @@ trait ReversibleRange: fn reversed[T: ReversibleRange](value: T) -> _StridedRange: """Get a reversed iterator of the input range. + **Note**: iterators are currently non-raising. + Parameters: T: The type conforming to ReversibleRange. @@ -87,6 +89,8 @@ fn reversed[ ]: """Get a reversed iterator of the input list. + **Note**: iterators are currently non-raising. + Parameters: T: The type of the elements in the list. @@ -126,6 +130,8 @@ fn reversed[ ](ref value: Dict[K, V],) -> _DictKeyIter[K, V, __origin_of(value), False]: """Get a reversed iterator of the input dict. + **Note**: iterators are currently non-raising. + Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. @@ -150,6 +156,8 @@ fn reversed[ ]: """Get a reversed iterator of the input dict values. + **Note**: iterators are currently non-raising. + Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. @@ -176,6 +184,8 @@ fn reversed[ ]: """Get a reversed iterator of the input dict items. + **Note**: iterators are currently non-raising. + Parameters: K: The type of the keys in the dict. V: The type of the values in the dict. @@ -197,7 +207,13 @@ fn reversed[ @always_inline fn reversed[ T: CollectionElement -](value: Span[T]) -> _SpanIter[T, value.origin, forward=False]: +](value: Span[T]) -> _SpanIter[ + T, + origin, + forward=False, + address_space=address_space, + alignment=alignment, +]: """Get a reversed iterator of the input Span. **Note**: iterators are currently non-raising. @@ -221,6 +237,8 @@ alias _S = CodepointSliceIter[_, forward=False] fn reversed(ref value: String) -> _S[__origin_of(value)]: """Return a reversed iterator. + **Note**: iterators are currently non-raising. + Args: value: The iterable value. @@ -234,6 +252,8 @@ fn reversed(ref value: String) -> _S[__origin_of(value)]: fn reversed(value: StringLiteral) -> _S[StaticConstantOrigin]: """Return a reversed iterator. + **Note**: iterators are currently non-raising. + Args: value: The iterable value. @@ -247,6 +267,8 @@ fn reversed(value: StringLiteral) -> _S[StaticConstantOrigin]: fn reversed(value: StringSlice) -> _S[__type_of(value).origin]: """Return a reversed iterator. + **Note**: iterators are currently non-raising. + Args: value: The iterable value. diff --git a/mojo/stdlib/test/builtin/test_string_literal.mojo b/mojo/stdlib/test/builtin/test_string_literal.mojo index 9c86161f4a..befd858cd1 100644 --- a/mojo/stdlib/test/builtin/test_string_literal.mojo +++ b/mojo/stdlib/test/builtin/test_string_literal.mojo @@ -324,7 +324,7 @@ def test_iter(): var idx = -1 vs = "mojo🔥" - var iterator = vs.__iter__() + var iterator = iter(vs) assert_equal(5, len(iterator)) var item = next(iterator) assert_equal(String("m"), String(item)) From a5baa3669155569f92347569517adb8373a4a1ae Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 17:51:33 -0300 Subject: [PATCH 35/36] fix details Signed-off-by: martinvuyk --- mojo/stdlib/src/builtin/range.mojo | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mojo/stdlib/src/builtin/range.mojo b/mojo/stdlib/src/builtin/range.mojo index f0d08e5b67..f818180938 100644 --- a/mojo/stdlib/src/builtin/range.mojo +++ b/mojo/stdlib/src/builtin/range.mojo @@ -34,6 +34,8 @@ from collections.dict import ( _DictEntryIter, DictEntry, ) +from memory.span import Span, _SpanIter + # ===----------------------------------------------------------------------=== # # Utilities From 20d9fe297b67c2c8a32c78464ec1d45d756c3648 Mon Sep 17 00:00:00 2001 From: martinvuyk Date: Fri, 28 Feb 2025 17:55:22 -0300 Subject: [PATCH 36/36] fix detail Signed-off-by: martinvuyk --- mojo/stdlib/src/builtin/range.mojo | 6 +++--- mojo/stdlib/src/builtin/reversed.mojo | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mojo/stdlib/src/builtin/range.mojo b/mojo/stdlib/src/builtin/range.mojo index f818180938..ce7ed7f9a0 100644 --- a/mojo/stdlib/src/builtin/range.mojo +++ b/mojo/stdlib/src/builtin/range.mojo @@ -691,9 +691,9 @@ fn iter[ T: CollectionElement ](value: Span[T]) -> _SpanIter[ T, - origin, - address_space=address_space, - alignment=alignment, + __type_of(value).origin, + address_space = __type_of(value).address_space, + alignment = __type_of(value).alignment, ]: """Return an iterator. diff --git a/mojo/stdlib/src/builtin/reversed.mojo b/mojo/stdlib/src/builtin/reversed.mojo index 46e3f9bdd7..ab327ae161 100644 --- a/mojo/stdlib/src/builtin/reversed.mojo +++ b/mojo/stdlib/src/builtin/reversed.mojo @@ -209,10 +209,10 @@ fn reversed[ T: CollectionElement ](value: Span[T]) -> _SpanIter[ T, - origin, + __type_of(value).origin, forward=False, - address_space=address_space, - alignment=alignment, + address_space = __type_of(value).address_space, + alignment = __type_of(value).alignment, ]: """Get a reversed iterator of the input Span.