| 1234567891011121314151617181920212223242526272829303132 |
- // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- // Exceptions. See /LICENSE for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- package Core library "prelude/iterate";
- export import library "prelude/copy";
- export import library "prelude/destroy";
- export import library "prelude/types";
- export import library "prelude/operators";
- interface Iterate {
- // TODO: Support iterating ranges of non-copyable values.
- let ElementType:! Copy & Destroy;
- let CursorType:! type;
- fn NewCursor[self: Self]() -> CursorType;
- fn Next[self: Self](cursor: CursorType*) -> Optional(ElementType);
- }
- impl forall [T:! Copy & Destroy, N:! IntLiteral()]
- array(T, N) as Iterate
- where .ElementType = T and .CursorType = i32 {
- fn NewCursor[unused self: Self]() -> i32 { return 0; }
- fn Next[self: Self](cursor: i32*) -> Optional(T) {
- if (*cursor < N) {
- ++*cursor;
- return Optional(T).Some(self[*cursor - 1]);
- } else {
- return Optional(T).None();
- }
- }
- }
|