aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Cavalieri <giacomo.cavalieri@icloud.com>2024-11-17 16:05:52 +0100
committerLouis Pilfold <louis@lpil.uk>2024-11-17 15:11:35 +0000
commitb19f32b0fc35302511252bc2273b649a7ddc40f5 (patch)
tree68e170a7336a7822520039ef808738d0b27b1bc3
parentec9cc3f3a88ac1970d003140d3006ba15e2565f4 (diff)
downloadgleam_stdlib-b19f32b0fc35302511252bc2273b649a7ddc40f5.tar.gz
gleam_stdlib-b19f32b0fc35302511252bc2273b649a7ddc40f5.zip
make string/bytes_builder aliases of tree counterparts
-rw-r--r--src/gleam/bytes_builder.gleam114
-rw-r--r--src/gleam/string_builder.gleam144
2 files changed, 78 insertions, 180 deletions
diff --git a/src/gleam/bytes_builder.gleam b/src/gleam/bytes_builder.gleam
index 9cdf631..330865f 100644
--- a/src/gleam/bytes_builder.gleam
+++ b/src/gleam/bytes_builder.gleam
@@ -20,23 +20,19 @@
//// On Erlang this type is compatible with Erlang's iolists.
// TODO: pad bit arrays to byte boundaries when adding to a builder.
-import gleam/bit_array
-import gleam/list
-import gleam/string_builder.{type StringBuilder}
+import gleam/bytes_tree.{type BytesTree}
+import gleam/string_tree.{type StringTree}
@deprecated("The `bytes_builder` module has been deprecated, use the `bytes_tree.BytesTree` type instead.")
-pub opaque type BytesBuilder {
- Bytes(BitArray)
- Text(StringBuilder)
- Many(List(BytesBuilder))
-}
+pub type BytesBuilder =
+ BytesTree
/// Create an empty `BytesBuilder`. Useful as the start of a pipe chaining many
/// builders together.
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.new` instead.")
-pub fn new() -> BytesBuilder {
- concat([])
+pub fn new() -> BytesTree {
+ bytes_tree.concat([])
}
/// Prepends a bit array to the start of a builder.
@@ -44,8 +40,8 @@ pub fn new() -> BytesBuilder {
/// Runs in constant time.
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.prepend` instead.")
-pub fn prepend(to second: BytesBuilder, prefix first: BitArray) -> BytesBuilder {
- append_builder(from_bit_array(first), second)
+pub fn prepend(to second: BytesTree, prefix first: BitArray) -> BytesTree {
+ bytes_tree.append_tree(bytes_tree.from_bit_array(first), second)
}
/// Appends a bit array to the end of a builder.
@@ -53,8 +49,8 @@ pub fn prepend(to second: BytesBuilder, prefix first: BitArray) -> BytesBuilder
/// Runs in constant time.
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.append` instead.")
-pub fn append(to first: BytesBuilder, suffix second: BitArray) -> BytesBuilder {
- append_builder(first, from_bit_array(second))
+pub fn append(to first: BytesTree, suffix second: BitArray) -> BytesTree {
+ bytes_tree.append_tree(first, bytes_tree.from_bit_array(second))
}
/// Prepends a builder onto the start of another.
@@ -63,10 +59,10 @@ pub fn append(to first: BytesBuilder, suffix second: BitArray) -> BytesBuilder {
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.prepend_tree` instead.")
pub fn prepend_builder(
- to second: BytesBuilder,
- prefix first: BytesBuilder,
-) -> BytesBuilder {
- append_builder(first, second)
+ to second: BytesTree,
+ prefix first: BytesTree,
+) -> BytesTree {
+ bytes_tree.append_tree(first, second)
}
/// Appends a builder onto the end of another.
@@ -76,13 +72,10 @@ pub fn prepend_builder(
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.append_tree` instead.")
@external(erlang, "gleam_stdlib", "iodata_append")
pub fn append_builder(
- to first: BytesBuilder,
- suffix second: BytesBuilder,
-) -> BytesBuilder {
- case second {
- Many(builders) -> Many([first, ..builders])
- _ -> Many([first, second])
- }
+ to first: BytesTree,
+ suffix second: BytesTree,
+) -> BytesTree {
+ bytes_tree.append_tree(first, second)
}
/// Prepends a string onto the start of a builder.
@@ -91,11 +84,8 @@ pub fn append_builder(
/// Runs in linear time with the length of the string otherwise.
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.prepend_string` instead.")
-pub fn prepend_string(
- to second: BytesBuilder,
- prefix first: String,
-) -> BytesBuilder {
- append_builder(from_string(first), second)
+pub fn prepend_string(to second: BytesTree, prefix first: String) -> BytesTree {
+ bytes_tree.append_tree(bytes_tree.from_string(first), second)
}
/// Appends a string onto the end of a builder.
@@ -104,11 +94,8 @@ pub fn prepend_string(
/// Runs in linear time with the length of the string otherwise.
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.append_string` instead.")
-pub fn append_string(
- to first: BytesBuilder,
- suffix second: String,
-) -> BytesBuilder {
- append_builder(first, from_string(second))
+pub fn append_string(to first: BytesTree, suffix second: String) -> BytesTree {
+ bytes_tree.append_tree(first, bytes_tree.from_string(second))
}
/// Joins a list of builders into a single builder.
@@ -117,8 +104,8 @@ pub fn append_string(
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.concat` instead.")
@external(erlang, "gleam_stdlib", "identity")
-pub fn concat(builders: List(BytesBuilder)) -> BytesBuilder {
- Many(builders)
+pub fn concat(builders: List(BytesTree)) -> BytesTree {
+ bytes_tree.concat(builders)
}
/// Joins a list of bit arrays into a single builder.
@@ -127,10 +114,8 @@ pub fn concat(builders: List(BytesBuilder)) -> BytesBuilder {
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.concat_bit_arrays` instead.")
@external(erlang, "gleam_stdlib", "identity")
-pub fn concat_bit_arrays(bits: List(BitArray)) -> BytesBuilder {
- bits
- |> list.map(fn(b) { from_bit_array(b) })
- |> concat()
+pub fn concat_bit_arrays(bits: List(BitArray)) -> BytesTree {
+ bytes_tree.concat_bit_arrays(bits)
}
/// Creates a new builder from a string.
@@ -140,8 +125,8 @@ pub fn concat_bit_arrays(bits: List(BitArray)) -> BytesBuilder {
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.from_string` instead.")
@external(erlang, "gleam_stdlib", "wrap_list")
-pub fn from_string(string: String) -> BytesBuilder {
- Text(string_builder.from_string(string))
+pub fn from_string(string: String) -> BytesTree {
+ bytes_tree.from_string(string)
}
/// Creates a new builder from a string builder.
@@ -151,8 +136,8 @@ pub fn from_string(string: String) -> BytesBuilder {
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.from_string_tree` instead.")
@external(erlang, "gleam_stdlib", "wrap_list")
-pub fn from_string_builder(builder: StringBuilder) -> BytesBuilder {
- Text(builder)
+pub fn from_string_builder(builder: StringTree) -> BytesTree {
+ bytes_tree.from_string_tree(builder)
}
/// Creates a new builder from a bit array.
@@ -161,8 +146,8 @@ pub fn from_string_builder(builder: StringBuilder) -> BytesBuilder {
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.from_bit_array` instead.")
@external(erlang, "gleam_stdlib", "wrap_list")
-pub fn from_bit_array(bits: BitArray) -> BytesBuilder {
- Bytes(bits)
+pub fn from_bit_array(bits: BitArray) -> BytesTree {
+ bytes_tree.from_bit_array(bits)
}
/// Turns an builder into a bit array.
@@ -174,33 +159,8 @@ pub fn from_bit_array(bits: BitArray) -> BytesBuilder {
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.to_bit_array` instead.")
@external(erlang, "erlang", "list_to_bitstring")
-pub fn to_bit_array(builder: BytesBuilder) -> BitArray {
- [[builder]]
- |> to_list([])
- |> list.reverse
- |> bit_array.concat
-}
-
-fn to_list(
- stack: List(List(BytesBuilder)),
- acc: List(BitArray),
-) -> List(BitArray) {
- case stack {
- [] -> acc
-
- [[], ..remaining_stack] -> to_list(remaining_stack, acc)
-
- [[Bytes(bits), ..rest], ..remaining_stack] ->
- to_list([rest, ..remaining_stack], [bits, ..acc])
-
- [[Text(builder), ..rest], ..remaining_stack] -> {
- let bits = bit_array.from_string(string_builder.to_string(builder))
- to_list([rest, ..remaining_stack], [bits, ..acc])
- }
-
- [[Many(builders), ..rest], ..remaining_stack] ->
- to_list([builders, rest, ..remaining_stack], acc)
- }
+pub fn to_bit_array(builder: BytesTree) -> BitArray {
+ bytes_tree.to_bit_array(builder)
}
/// Returns the size of the builder's content in bytes.
@@ -209,8 +169,6 @@ fn to_list(
///
@deprecated("The `bytes_builder` module has been deprecated, use `bytes_tree.byte_size` instead.")
@external(erlang, "erlang", "iolist_size")
-pub fn byte_size(builder: BytesBuilder) -> Int {
- [[builder]]
- |> to_list([])
- |> list.fold(0, fn(acc, builder) { bit_array.byte_size(builder) + acc })
+pub fn byte_size(builder: BytesTree) -> Int {
+ bytes_tree.byte_size(builder)
}
diff --git a/src/gleam/string_builder.gleam b/src/gleam/string_builder.gleam
index c5af2db..bf89bd3 100644
--- a/src/gleam/string_builder.gleam
+++ b/src/gleam/string_builder.gleam
@@ -1,4 +1,4 @@
-import gleam/list
+import gleam/string_tree.{type StringTree}
/// `StringBuilder` is a type used for efficiently building text content to be
/// written to a file or a socket. Internally it is represented as tree so to
@@ -17,14 +17,15 @@ import gleam/list
/// sensitive code.
///
@deprecated("The `string_builder` module has been deprecated, use the `string_tree.StringTree` type instead.")
-pub type StringBuilder
+pub type StringBuilder =
+ StringTree
/// Create an empty `StringBuilder`. Useful as the start of a pipe chaining many
/// builders together.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.new` instead.")
-pub fn new() -> StringBuilder {
- do_from_strings([])
+pub fn new() -> StringTree {
+ string_tree.from_strings([])
}
/// Prepends a `String` onto the start of some `StringBuilder`.
@@ -32,11 +33,8 @@ pub fn new() -> StringBuilder {
/// Runs in constant time.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.prepend` instead.")
-pub fn prepend(
- to builder: StringBuilder,
- prefix prefix: String,
-) -> StringBuilder {
- append_builder(from_string(prefix), builder)
+pub fn prepend(to builder: StringTree, prefix prefix: String) -> StringTree {
+ string_tree.append_tree(string_tree.from_string(prefix), builder)
}
/// Appends a `String` onto the end of some `StringBuilder`.
@@ -44,8 +42,8 @@ pub fn prepend(
/// Runs in constant time.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.append` instead.")
-pub fn append(to builder: StringBuilder, suffix second: String) -> StringBuilder {
- append_builder(builder, from_string(second))
+pub fn append(to builder: StringTree, suffix second: String) -> StringTree {
+ string_tree.append_tree(builder, string_tree.from_string(second))
}
/// Prepends some `StringBuilder` onto the start of another.
@@ -54,10 +52,10 @@ pub fn append(to builder: StringBuilder, suffix second: String) -> StringBuilder
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.prepend_tree` instead.")
pub fn prepend_builder(
- to builder: StringBuilder,
- prefix prefix: StringBuilder,
-) -> StringBuilder {
- do_append(prefix, builder)
+ to builder: StringTree,
+ prefix prefix: StringTree,
+) -> StringTree {
+ string_tree.prepend_tree(builder, prefix)
}
/// Appends some `StringBuilder` onto the end of another.
@@ -66,161 +64,103 @@ pub fn prepend_builder(
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.append_tree` instead.")
pub fn append_builder(
- to builder: StringBuilder,
- suffix suffix: StringBuilder,
-) -> StringBuilder {
- do_append(builder, suffix)
+ to builder: StringTree,
+ suffix suffix: StringTree,
+) -> StringTree {
+ string_tree.append_tree(builder, suffix)
}
-@external(erlang, "gleam_stdlib", "iodata_append")
-@external(javascript, "../gleam_stdlib.mjs", "add")
-fn do_append(a: StringBuilder, b: StringBuilder) -> StringBuilder
-
/// Converts a list of strings into a builder.
///
/// Runs in constant time.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.from_strings` instead.")
-pub fn from_strings(strings: List(String)) -> StringBuilder {
- do_from_strings(strings)
+pub fn from_strings(strings: List(String)) -> StringTree {
+ string_tree.from_strings(strings)
}
-@external(erlang, "gleam_stdlib", "identity")
-@external(javascript, "../gleam_stdlib.mjs", "concat")
-fn do_from_strings(a: List(String)) -> StringBuilder
-
/// Joins a list of builders into a single builder.
///
/// Runs in constant time.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.concat` instead.")
-pub fn concat(builders: List(StringBuilder)) -> StringBuilder {
- do_concat(builders)
+pub fn concat(builders: List(StringTree)) -> StringTree {
+ string_tree.concat(builders)
}
-@external(erlang, "gleam_stdlib", "identity")
-@external(javascript, "../gleam_stdlib.mjs", "concat")
-fn do_concat(builders: List(StringBuilder)) -> StringBuilder
-
/// Converts a string into a builder.
///
/// Runs in constant time.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.from_string` instead.")
-pub fn from_string(string: String) -> StringBuilder {
- do_from_string(string)
+pub fn from_string(string: String) -> StringTree {
+ string_tree.from_string(string)
}
-@external(erlang, "gleam_stdlib", "identity")
-@external(javascript, "../gleam_stdlib.mjs", "identity")
-fn do_from_string(string: String) -> StringBuilder
-
/// Turns an `StringBuilder` into a `String`
///
/// This function is implemented natively by the virtual machine and is highly
/// optimised.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.to_string` instead.")
-pub fn to_string(builder: StringBuilder) -> String {
- do_to_string(builder)
+pub fn to_string(builder: StringTree) -> String {
+ string_tree.to_string(builder)
}
-@external(erlang, "unicode", "characters_to_binary")
-@external(javascript, "../gleam_stdlib.mjs", "identity")
-fn do_to_string(builder: StringBuilder) -> String
-
/// Returns the size of the `StringBuilder` in bytes.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.byte_size` instead.")
-pub fn byte_size(builder: StringBuilder) -> Int {
- do_byte_size(builder)
+pub fn byte_size(builder: StringTree) -> Int {
+ string_tree.byte_size(builder)
}
-@external(erlang, "erlang", "iolist_size")
-@external(javascript, "../gleam_stdlib.mjs", "length")
-fn do_byte_size(builder: StringBuilder) -> Int
-
/// Joins the given builders into a new builder separated with the given string
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.join` instead.")
-pub fn join(builders: List(StringBuilder), with sep: String) -> StringBuilder {
- builders
- |> list.intersperse(from_string(sep))
- |> concat
+pub fn join(builders: List(StringTree), with sep: String) -> StringTree {
+ string_tree.join(builders, sep)
}
/// Converts a builder to a new builder where the contents have been
/// lowercased.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.lowercase` instead.")
-pub fn lowercase(builder: StringBuilder) -> StringBuilder {
- do_lowercase(builder)
+pub fn lowercase(builder: StringTree) -> StringTree {
+ string_tree.lowercase(builder)
}
-@external(erlang, "string", "lowercase")
-@external(javascript, "../gleam_stdlib.mjs", "lowercase")
-fn do_lowercase(builder: StringBuilder) -> StringBuilder
-
/// Converts a builder to a new builder where the contents have been
/// uppercased.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.uppercase` instead.")
-pub fn uppercase(builder: StringBuilder) -> StringBuilder {
- do_uppercase(builder)
+pub fn uppercase(builder: StringTree) -> StringTree {
+ string_tree.uppercase(builder)
}
-@external(erlang, "string", "uppercase")
-@external(javascript, "../gleam_stdlib.mjs", "uppercase")
-fn do_uppercase(builder: StringBuilder) -> StringBuilder
-
/// Converts a builder to a new builder with the contents reversed.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.reverse` instead.")
-pub fn reverse(builder: StringBuilder) -> StringBuilder {
- do_reverse(builder)
+pub fn reverse(builder: StringTree) -> StringTree {
+ string_tree.reverse(builder)
}
-@external(erlang, "string", "reverse")
-fn do_reverse(builder: StringBuilder) -> StringBuilder {
- builder
- |> to_string
- |> do_to_graphemes
- |> list.reverse
- |> from_strings
-}
-
-@external(javascript, "../gleam_stdlib.mjs", "graphemes")
-fn do_to_graphemes(string: String) -> List(String)
-
/// Splits a builder on a given pattern into a list of builders.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.split` instead.")
-pub fn split(iodata: StringBuilder, on pattern: String) -> List(StringBuilder) {
- do_split(iodata, pattern)
-}
-
-type Direction {
- All
-}
-
-@external(javascript, "../gleam_stdlib.mjs", "split")
-fn do_split(iodata: StringBuilder, pattern: String) -> List(StringBuilder) {
- erl_split(iodata, pattern, All)
+pub fn split(iodata: StringTree, on pattern: String) -> List(StringTree) {
+ string_tree.split(iodata, pattern)
}
-@external(erlang, "string", "split")
-fn erl_split(a: StringBuilder, b: String, c: Direction) -> List(StringBuilder)
-
/// Replaces all instances of a pattern with a given string substitute.
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.replace` instead.")
@external(erlang, "gleam_stdlib", "string_replace")
@external(javascript, "../gleam_stdlib.mjs", "string_replace")
pub fn replace(
- in builder: StringBuilder,
+ in builder: StringTree,
each pattern: String,
with substitute: String,
-) -> StringBuilder
+) -> StringTree
/// Compares two builders to determine if they have the same textual content.
///
@@ -242,7 +182,7 @@ pub fn replace(
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.is_equal` instead.")
@external(erlang, "string", "equal")
-pub fn is_equal(a: StringBuilder, b: StringBuilder) -> Bool {
+pub fn is_equal(a: StringTree, b: StringTree) -> Bool {
a == b
}
@@ -267,6 +207,6 @@ pub fn is_equal(a: StringBuilder, b: StringBuilder) -> Bool {
///
@deprecated("The `string_builder` module has been deprecated, use `string_tree.is_empty` instead.")
@external(erlang, "string", "is_empty")
-pub fn is_empty(builder: StringBuilder) -> Bool {
- from_string("") == builder
+pub fn is_empty(builder: StringTree) -> Bool {
+ string_tree.from_string("") == builder
}