lean4-htt/src/Init/Data/String/Bootstrap.lean
Joachim Breitner 9167b13afa
refactor: move String.ofList to the Prelude (#12029)
This PR moves `String.ofList` to `Init.Prelude`. It is a function that
the Lean kernel expects to be present and has special support for (when
reducing string literals). By moving this to `Init.Prelude`, all
declarations that are special to the kernel are in that single module.
2026-01-19 08:22:13 +00:00

198 lines
5.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura, Mario Carneiro
-/
module
prelude
public import Init.Data.Char.Basic
public import Init.Data.ByteArray.Bootstrap
public section
namespace String
instance : OfNat String.Pos.Raw (nat_lit 0) where
ofNat := {}
instance : Inhabited String where
default := ""
/--
Adds a character to the end of a string.
The internal implementation uses dynamic arrays and will perform destructive updates
if the string is not shared.
Examples:
* `"abc".push 'd' = "abcd"`
* `"".push 'a' = "a"`
-/
@[extern "lean_string_push", expose]
def push : String → Char → String
| ⟨b, h⟩, c => ⟨b.append (List.utf8Encode [c]), ?pf⟩
where finally
have ⟨m, hm⟩ := h
cases hm
exact .intro (m ++ [c]) (by simp [List.utf8Encode, List.toByteArray_append'])
/--
Returns a new string that contains only the character `c`.
Because strings are encoded in UTF-8, the resulting string may take multiple bytes.
Examples:
* `String.singleton 'L' = "L"`
* `String.singleton ' ' = " "`
* `String.singleton '"' = "\""`
* `String.singleton '𝒫' = "𝒫"`
-/
@[inline, expose] def singleton (c : Char) : String :=
"".push c
end String
namespace String.Internal
@[extern "lean_string_posof"]
opaque posOf (s : String) (c : Char) : Pos.Raw
@[extern "lean_string_offsetofpos"]
opaque offsetOfPos (s : String) (pos : Pos.Raw) : Nat
@[extern "lean_string_utf8_extract"]
opaque extract : (@& String) → (@& Pos.Raw) → (@& Pos.Raw) → String
@[extern "lean_string_length"]
opaque length : (@& String) → Nat
@[extern "lean_string_pushn"]
opaque pushn (s : String) (c : Char) (n : Nat) : String
@[extern "lean_string_append"]
opaque append : String → (@& String) → String
@[extern "lean_string_utf8_next"]
opaque next (s : @& String) (p : @& Pos.Raw) : Pos.Raw
@[extern "lean_string_isempty"]
opaque isEmpty (s : String) : Bool
@[extern "lean_string_foldl"]
opaque foldl (f : String → Char → String) (init : String) (s : String) : String
@[extern "lean_string_isprefixof"]
opaque isPrefixOf (p : String) (s : String) : Bool
@[extern "lean_string_any"]
opaque any (s : String) (p : Char → Bool) : Bool
@[extern "lean_string_contains"]
opaque contains (s : String) (c : Char) : Bool
@[extern "lean_string_utf8_get"]
opaque get (s : @& String) (p : @& Pos.Raw) : Char
@[extern "lean_string_capitalize"]
opaque capitalize (s : String) : String
@[extern "lean_string_utf8_at_end"]
opaque atEnd : (@& String) → (@& Pos.Raw) → Bool
@[extern "lean_string_nextwhile"]
opaque nextWhile (s : String) (p : Char → Bool) (i : String.Pos.Raw) : String.Pos.Raw
@[extern "lean_string_trim"]
opaque trim (s : String) : String
@[extern "lean_string_intercalate"]
opaque intercalate (s : String) : List String → String
@[extern "lean_string_front"]
opaque front (s : String) : Char
@[extern "lean_string_drop"]
opaque drop (s : String) (n : Nat) : String
@[extern "lean_string_dropright"]
opaque dropRight (s : String) (n : Nat) : String
@[extern "lean_string_get_byte_fast"]
opaque getUTF8Byte (s : @& String) (n : Nat) (h : n < s.utf8ByteSize) : UInt8
end String.Internal
@[extern "lean_string_mk", expose, deprecated String.ofList (since := "2025-10-30")]
def String.mk (data : List Char) : String :=
⟨List.utf8Encode data,.intro data rfl⟩
/--
Creates a string that contains the characters in a list, in order.
Examples:
* `['L', '∃', '∀', 'N'].asString = "L∃∀N"`
* `[].asString = ""`
* `['a', 'a', 'a'].asString = "aaa"`
-/
@[expose, inline, deprecated String.ofList (since := "2025-10-30")]
def List.asString (s : List Char) : String :=
String.ofList s
namespace Substring.Raw.Internal
@[extern "lean_substring_tostring"]
opaque toString : Substring.Raw → String
@[extern "lean_substring_drop"]
opaque drop : Substring.Raw → Nat → Substring.Raw
@[extern "lean_substring_front"]
opaque front (s : Substring.Raw) : Char
@[extern "lean_substring_takewhile"]
opaque takeWhile : Substring.Raw → (Char → Bool) → Substring.Raw
@[extern "lean_substring_extract"]
opaque extract : Substring.Raw → String.Pos.Raw → String.Pos.Raw → Substring.Raw
@[extern "lean_substring_all"]
opaque all (s : Substring.Raw) (p : Char → Bool) : Bool
@[extern "lean_substring_beq"]
opaque beq (ss1 ss2 : Substring.Raw) : Bool
@[extern "lean_substring_isempty"]
opaque isEmpty (ss : Substring.Raw) : Bool
@[extern "lean_substring_get"]
opaque get : Substring.Raw → String.Pos.Raw → Char
@[extern "lean_substring_prev"]
opaque prev : Substring.Raw → String.Pos.Raw → String.Pos.Raw
end Substring.Raw.Internal
namespace String.Pos.Raw.Internal
@[extern "lean_string_pos_sub"]
opaque sub : String.Pos.Raw → String.Pos.Raw → String.Pos.Raw
@[extern "lean_string_pos_min"]
opaque min (p₁ p₂ : Pos.Raw) : Pos.Raw
end String.Pos.Raw.Internal
namespace Char
/--
Constructs a singleton string that contains only the provided character.
Examples:
* `'L'.toString = "L"`
* `'"'.toString = "\""`
-/
@[inline, expose] protected def toString (c : Char) : String :=
String.singleton c
end Char