This PR introduces slices of lists that are available via slice notation (e.g., `xs[1...5]`). * Moved the `take` combinator and the `List` iterator producer to `Init`. * Introduced a `toTake` combinator: `it.toTake` behaves like `it`, but it has the same type as `it.take n`. There is a constant cost per iteration compared to `it` itself. * Introduced `List` slices. Their iterators are defined as `suffixList.iter.take n` for upper-bounded slices and `suffixList.iter.toTake` for unbounded ones. Performance characteristics of using the slice `list[a...b]`: * when creating it: `O(a)` * every iterator step: `O(1)` * `toList`: `O(b - a + 1)` (given that a <= b) Because the slice only stores a suffix of `xs` internally, two slices can be equal even though the underlying lists differ in an irrelevant prefix. Because the `stop` field is allowed to be beyond the list's upper bound, the slices `[1][0...1]` and `[1][0...2]` are not equal, even though they effectively cover the same range of the same list. Improving this would require us to call `List.length` when building the slice, which would iterate through the whole list.
30 lines
987 B
Text
30 lines
987 B
Text
/-
|
|
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Paul Reichert
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Init.Data.Slice.Basic
|
|
public import Init.Data.Slice.Notation
|
|
public import Init.Data.Slice.Operations
|
|
public import Init.Data.Slice.Array
|
|
public import Init.Data.Slice.List
|
|
public import Init.Data.Slice.Lemmas
|
|
|
|
public section
|
|
|
|
/-!
|
|
# Polymorphic slices
|
|
|
|
This module provides slices -- views on a subset of all elements of an array or other collection,
|
|
demarcated by a range of indices.
|
|
|
|
* `Init.Data.Slice.Basic` defines the `Slice` structure. All slices are of this type.
|
|
* `Init.Data.Slice.Operations` provides functions on `Slice` via dot notation. Many of them are
|
|
implemented using iterators under the hood.
|
|
* `Init.Data.Slice.Notation` provides slice notation based on ranges, relying on the `Sliceable`
|
|
typeclass.
|
|
* `Init.Data.Slice.Array` provides the `Sliceable` instance for array slices.
|
|
-/
|