| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // 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
- // TODO: This library is not part of the design. Either write a matching
- // proposal or remove this.
- package Core library "range";
- import library "prelude/destroy";
- import library "prelude/iterate";
- import library "prelude/operators/arithmetic";
- import library "prelude/operators/as";
- import library "prelude/operators/comparison";
- import library "prelude/types/int";
- import library "prelude/types/int_literal";
- import library "prelude/types/optional";
- class IntRange(N:! IntLiteral()) {
- fn Make(start: Int(N), end: Int(N)) -> Self {
- return {.start = start, .end = end};
- }
- impl as Iterate where .CursorType = Int(N) and .ElementType = Int(N) {
- fn NewCursor[self: Self]() -> Int(N) { return self.start; }
- fn Next[self: Self](cursor: Int(N)*) -> Optional(Int(N)) {
- var value: Int(N) = *cursor;
- if (value < self.end) {
- ++*cursor;
- return Optional(Int(N)).Some(value);
- } else {
- return Optional(Int(N)).None();
- }
- }
- }
- private var start: Int(N);
- private var end: Int(N);
- }
- fn Range(end: i32) -> IntRange(32) {
- return IntRange(32).Make(0, end);
- }
- fn InclusiveRange(start: i32, end: i32) -> IntRange(32) {
- return IntRange(32).Make(start, end + 1);
- }
|