Skip to content

Commit d6d19a9

Browse files
Add removeDuplicateEmptyLines and endWithNewLine
1 parent 688faf0 commit d6d19a9

File tree

6 files changed

+50
-0
lines changed

6 files changed

+50
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
### Added
66

7+
- `List<String>.removeDuplicateEmptyLines`
8+
- `String.removeDuplicateEmptyLines`
9+
- `String.endWithNewLine`
10+
711
### Changed
812

913
- `emptyString()` to `String.Empty`

kotlin-stdlib/api/kotlin-stdlib.api

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,22 @@ public final class com/javiersc/kotlin/stdlib/CollectionsKt {
150150
public static final fun getIndexOrNull (Ljava/lang/Iterable;I)Ljava/lang/Object;
151151
public static final fun penultimate (Ljava/lang/Iterable;)Ljava/lang/Object;
152152
public static final fun penultimateOrNull (Ljava/lang/Iterable;)Ljava/lang/Object;
153+
public static final fun removeDuplicateEmptyLines (Ljava/util/List;)Ljava/lang/String;
153154
public static final fun second (Ljava/lang/Iterable;)Ljava/lang/Object;
154155
public static final fun secondOrNull (Ljava/lang/Iterable;)Ljava/lang/Object;
155156
public static final fun third (Ljava/lang/Iterable;)Ljava/lang/Object;
156157
public static final fun thirdOrNull (Ljava/lang/Iterable;)Ljava/lang/Object;
157158
}
158159

159160
public final class com/javiersc/kotlin/stdlib/StringsKt {
161+
public static final fun endWithNewLine (Ljava/lang/String;)Ljava/lang/String;
160162
public static final fun getEmpty (Lkotlin/jvm/internal/StringCompanionObject;)Ljava/lang/String;
161163
public static final fun isNotNullNorBlank (Ljava/lang/CharSequence;)Z
162164
public static final fun isNotNullNorBlank (Ljava/lang/String;)Z
163165
public static final fun isNotNullNorEmpty (Ljava/lang/CharSequence;)Z
164166
public static final fun isNotNullNorEmpty (Ljava/lang/String;)Z
165167
public static final fun remove (Ljava/lang/String;Ljava/lang/String;Z)Ljava/lang/String;
166168
public static synthetic fun remove$default (Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String;
169+
public static final fun removeDuplicateEmptyLines (Ljava/lang/String;)Ljava/lang/String;
167170
}
168171

kotlin-stdlib/commonMain/kotlin/com/javiersc/kotlin/stdlib/Collections.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,11 @@ internal inline fun <T> Iterable<T>.getIndexOrNull(index: Int): T? {
126126
}
127127
}
128128
}
129+
130+
/** Remove all consecutive line breaks in a list of `String` */
131+
public fun List<String>.removeDuplicateEmptyLines(): String =
132+
if (isNotEmpty()) {
133+
reduce { acc: String, b: String ->
134+
if (acc.lines().lastOrNull().isNullOrBlank() && b.isBlank()) acc else "$acc\n$b"
135+
}
136+
} else ""

kotlin-stdlib/commonMain/kotlin/com/javiersc/kotlin/stdlib/Strings.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,10 @@ public inline fun String?.isNotNullNorEmpty(): Boolean {
3939

4040
public inline val String.Companion.Empty: String
4141
get() = ""
42+
43+
/** Remove all consecutive line breaks in a `String` */
44+
public fun String.removeDuplicateEmptyLines(): String = lines().removeDuplicateEmptyLines()
45+
46+
/** Add an empty line as last item if it is not empty */
47+
public fun String.endWithNewLine(): String =
48+
if (lines().lastOrNull().isNullOrBlank()) this else "$this\n"

kotlin-stdlib/commonTest/kotlin/com/javiersc/kotlin/stdlib/CollectionsTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,14 @@ class CollectionsTest {
8585
shouldThrow<NoSuchElementException> { listOf(1).penultimate() }
8686
shouldThrow<NoSuchElementException> { listOf(1).asIterable().penultimate() }
8787
}
88+
89+
@Test
90+
fun remove_duplicate_empty_lines() {
91+
listOf("a", "b", "", "", "c", "").removeDuplicateEmptyLines().shouldBe("a\nb\n\nc\n")
92+
listOf("a", "b", "", "", "", "c", "").removeDuplicateEmptyLines().shouldBe("a\nb\n\nc\n")
93+
listOf("a", "b", "", "", "c", "", "").removeDuplicateEmptyLines().shouldBe("a\nb\n\nc\n")
94+
listOf("a", "", "", "", "b", "", "").removeDuplicateEmptyLines().shouldBe("a\n\nb\n")
95+
emptyList<String>().removeDuplicateEmptyLines().shouldBe("")
96+
listOf("").removeDuplicateEmptyLines().shouldBe("")
97+
}
8898
}

kotlin-stdlib/commonTest/kotlin/com/javiersc/kotlin/stdlib/StringsTest.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,22 @@ class StringsTest {
3535
fun empty_string() {
3636
String.Empty.shouldBeEmpty()
3737
}
38+
39+
@Test
40+
fun remove_duplicate_empty_lines() {
41+
"a\nb\n\n\nc\n".removeDuplicateEmptyLines().shouldBe("a\nb\n\nc\n")
42+
"a\n\nb\n\n\nc\n".removeDuplicateEmptyLines().shouldBe("a\n\nb\n\nc\n")
43+
"a\n\nb\n\n\nc\n\n".removeDuplicateEmptyLines().shouldBe("a\n\nb\n\nc\n")
44+
"a\n\n\n\n\nb\n\n".removeDuplicateEmptyLines().shouldBe("a\n\nb\n")
45+
}
46+
47+
@Test
48+
fun end_with_new_line() {
49+
"a".endWithNewLine().shouldBe("a\n")
50+
"a\n".endWithNewLine().shouldBe("a\n")
51+
"".endWithNewLine().shouldBe("")
52+
"a\nb".endWithNewLine().shouldBe("a\nb\n")
53+
"".endWithNewLine().shouldBe("")
54+
"\n".endWithNewLine().shouldBe("\n")
55+
}
3856
}

0 commit comments

Comments
 (0)