From 051e4df9e4061189e5f4d73b12deb88149a14f73 Mon Sep 17 00:00:00 2001
From: Janne Mareike Koschinski <janne@kuschku.de>
Date: Thu, 3 Mar 2022 19:14:44 +0100
Subject: [PATCH] feat: implement string joiner

---
 .../util/backport/StringJoiner.kt             | 39 +++++++++++++++++++
 .../util/extensions/StringJoinerExtensions.kt | 12 ++++++
 2 files changed, 51 insertions(+)
 create mode 100644 app/src/main/kotlin/de/justjanne/quasseldroid/util/backport/StringJoiner.kt
 create mode 100644 app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/StringJoinerExtensions.kt

diff --git a/app/src/main/kotlin/de/justjanne/quasseldroid/util/backport/StringJoiner.kt b/app/src/main/kotlin/de/justjanne/quasseldroid/util/backport/StringJoiner.kt
new file mode 100644
index 000000000..20d737f30
--- /dev/null
+++ b/app/src/main/kotlin/de/justjanne/quasseldroid/util/backport/StringJoiner.kt
@@ -0,0 +1,39 @@
+package de.justjanne.quasseldroid.util.backport
+
+import java.io.Serializable
+
+class StringJoiner(
+  private val delimiter: String,
+  private val prefix: String = "",
+  private val suffix: String = ""
+) : Serializable, Appendable {
+  private val builder = StringBuilder()
+
+  override fun append(data: CharSequence?, start: Int, end: Int): StringJoiner =
+    this.apply { prepareBuilder().append(data, start, end) }
+
+  override fun append(data: CharSequence?): StringJoiner =
+    this.apply { prepareBuilder().append(data) }
+
+  override fun append(data: Char): StringJoiner =
+    this.apply { prepareBuilder().append(data) }
+
+  private fun prepareBuilder(): StringBuilder = builder.apply {
+    append(if (isEmpty()) prefix else delimiter)
+  }
+
+  override fun toString(): String =
+    if (builder.isEmpty()) {
+      prefix + suffix
+    } else {
+      val length = builder.length
+      builder.append(suffix)
+      val result = builder.toString()
+      builder.setLength(length)
+      result
+    }
+
+  fun length(): Int =
+    if (builder.isEmpty()) prefix.length + suffix.length
+    else builder.length + suffix.length
+}
diff --git a/app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/StringJoinerExtensions.kt b/app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/StringJoinerExtensions.kt
new file mode 100644
index 000000000..c5d8ac51b
--- /dev/null
+++ b/app/src/main/kotlin/de/justjanne/quasseldroid/util/extensions/StringJoinerExtensions.kt
@@ -0,0 +1,12 @@
+package de.justjanne.quasseldroid.util.extensions
+
+import de.justjanne.quasseldroid.util.backport.StringJoiner
+
+inline fun joinString(
+  delimiter: String = "",
+  prefix: String = "",
+  suffix: String = "",
+  builderAction: StringJoiner.() -> Unit
+): String {
+  return StringJoiner(delimiter, prefix, suffix).apply(builderAction).toString()
+}
-- 
GitLab