ByteArray 类似于 Array UInt8,但具有高效的运行时表示,即紧凑存储的字节缓冲区。
构造子
ByteArray.mk
字节数组是一种专门化的数组类型,只能包含类型为 UInt8 的元素。
由于这一限制,它们可以采用高效得多的表示,不需要指针间接访问。
与其他数组一样,字节数组在编译后的代码中表示为 动态数组,Lean 运行时还会专门优化其数组操作。
修改字节数组的操作会先检查该数组的 引用计数;如果没有其他引用指向该数组,就会原地修改它。
字节数组没有字面量语法。
可以使用 List.toByteArray 从列表字面量构造字节数组。
构造初始容量为 c 的新空字节数组。
返回字节数组中的字节数。
这是数组中实际包含的字节数,不同于容量;容量是当前为数组分配的内存量。
获取指定索引处的字节。调用者必须证明索引未越界。
可使用 uget 作为更高效的替代方案;也可使用 get!,它在索引越界时触发 panic。
获取指定索引处的字节。如果索引越界,则触发 panic。
将紧凑存储的字节数组转换为链表。
ByteArray.utf8DecodeChar (bytes : ByteArray) (i : Nat) (h : (bytes.utf8DecodeChar? i).isSome = true) : CharByteArray.utf8DecodeChar (bytes : ByteArray) (i : Nat) (h : (bytes.utf8DecodeChar? i).isSome = true) : Char
替换给定索引处的字节。
此函数不执行边界检查,但要求提供索引未越界的证明。通常可以省略该证明,系统会自动合成。
如果数组没有其他引用,则会原地修改。
替换给定索引处的字节。
此函数不执行边界检查,但要求提供索引未越界的证明。通常可以省略该证明,系统会自动合成。
如果数组没有其他引用,则会原地修改。
替换给定索引处的字节。
如果数组没有其他引用,则会原地修改。
如果索引越界,则原样返回数组。
对 ByteArray 执行左折叠:按索引从小到大遍历数组,并计算一个累积值。
数组的每个元素都通过函数 f 与此前元素得到的值合并。初始值 init 是处理任何元素之前的起始值。
ByteArray.foldlM 是此函数的单子版本。
对 ByteArray 执行单子左折叠:按索引从小到大遍历数组,并计算一个累积值。
数组的每个元素都通过单子函数 f 与此前元素得到的值合并。初始值 init 是处理任何元素之前的起始值。
ByteArray.forIn.{v, w} {β : Type v} {m : Type v → Type w} [Monad m] (as : ByteArray) (b : β) (f : UInt8 → β → m (ForInStep β)) : m βByteArray.forIn.{v, w} {β : Type v} {m : Type v → Type w} [Monad m] (as : ByteArray) (b : β) (f : UInt8 → β → m (ForInStep β)) : m β
这是 ForIn.forIn 针对 ByteArray 的参考实现。
在编译后的代码中,它会被更高效的 ByteArray.forInUnsafe 替换。
创建位于数组开头的迭代器。
遍历字节(UInt8)的迭代器,其对象是一个 ByteArray。
通常通过 arr.iter 创建,其中 arr 是一个 ByteArray。
如果位置 i 对数组 arr 有效,即 0 ≤ i ≤ arr.size,则称迭代器有效。
如果迭代器无效,大多数迭代器操作都会返回任意值。ByteArray.Iterator API 中的函数应当排除无效迭代器的产生,但有两个例外:
Iterator.next iter 会无效,如果 iter 已位于数组末尾,即 iter.atEnd 为 true
Iterator.forward iter n/Iterator.nextn iter n 会无效,如果 n 严格大于剩余字节数
如果迭代器已经越过数组的最后一个字节,则为真。
如果迭代器有效,即尚未越过数组的最后一个字节,则为真。
如果位置不为零,则为真。
当前位置的字节。-
将迭代器的位置向前移动一个字节。-
将迭代器的位置向前移动若干字节。
仅当要跳过的字节数小于或等于迭代器中的剩余字节数时,所得迭代器才有效。
将迭代器的位置向前移动若干字节。
仅当要跳过的字节数小于或等于迭代器中的剩余字节数时,所得迭代器才有效。
减小迭代器的位置。
如果位置为零,则此函数不改变迭代器。
将迭代器的位置向后移动若干字节。
如果要求后退的字节数多于可用字节数,则停在数组开头。
迭代器中剩余的字节数。
返回字节数组中具有给定边界的字节切片。
如果 start 或 stop 不是字节切片的有效边界,则将其限制在字节数组大小以内。此外,起始索引会被限制为不超过结束索引。
某个底层字节数组的一段区域。
字节切片包含一个字节数组,以及感兴趣区域的起始和结束索引。字节切片既能避免复制或分配空间,又比手动追踪边界更方便。感兴趣区域由所有大于或等于 start 且严格小于 stop 的索引组成。
底层字节数组。
从右向左对字节切片中的字节执行折叠操作。
构造类型为 β 的累加器:从 init 开始,从末尾移向开头,依次将字节切片中的每个字节与当前累加器值合并。
示例:
(ByteArray.mk #[1, 2, 3]).toByteSlice.foldr (·.toNat + ·) 0 = 6
(ByteArray.mk #[1, 2, 3]).toByteSlice.popFront.foldr (·.toNat + ·) 0 = 5
ByteSlice.foldrM.{v, w} {β : Type v} {m : Type v → Type w} [Monad m] (f : UInt8 → β → m β) (init : β) (as : ByteSlice) : m βByteSlice.foldrM.{v, w} {β : Type v} {m : Type v → Type w} [Monad m] (f : UInt8 → β → m β) (init : β) (as : ByteSlice) : m β
从右向左对字节切片中的字节执行单子折叠操作。
构造类型为 β 的累加器:从 init 开始,从末尾移向开头,依次以单子方式将字节切片中的每个字节与当前累加器值合并。所用单子可以允许提前终止或重复。
示例:
#eval (ByteArray.mk #[1, 2, 3]).toByteSlice.foldrM (init := 0) fun x acc => some x.toNat + acc
some 6对字节切片中的每个字节执行单子动作。
从最小索引开始,按索引递增的顺序处理字节。
从字节切片中取出一个字节。
索引相对于字节切片的起点,而非底层字节数组。
从字节切片中取出一个字节;索引越界时返回默认值。
索引相对于字节切片的起点和终点,而非底层字节数组。默认值为 0。
从字节切片中取出一个字节;索引越界时返回默认值 v₀。
索引相对于字节切片的起点和终点,而非底层字节数组。
从 ByteArray 创建新的 ByteSlice
以给定边界创建字节切片的子切片。
如果 start 或 stop 不是子切片的有效边界,则将其限制在切片大小以内。此外,起始索引会被限制为不超过结束索引。
索引相对于当前切片,而非底层字节数组。
复制相关部分,将字节切片转换回字节数组。