diff options
-rw-r--r-- | src/gleam/bytes_builder.gleam | 114 | ||||
-rw-r--r-- | src/gleam/string_builder.gleam | 144 |
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 } |