Add `empty` constant. (#54)
Adds a reusable constant `empty` characters object for people to use,
and makes the `Character` constructor return that for the empty string.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0944a53..68aa55b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
-## 1.1.1-dev
+## 1.2.0
-* Switched from using lints in package:pedantic to package:lints.
+* Adds `Characters.empty` constant and makes `Characters("")` return it.
## 1.1.0
diff --git a/lib/src/characters.dart b/lib/src/characters.dart
index bcc70bb..b8b7949 100644
--- a/lib/src/characters.dart
+++ b/lib/src/characters.dart
@@ -20,9 +20,15 @@
/// but which also provides ways to select other ranges of characters
/// in different ways.
abstract class Characters implements Iterable<String> {
+ /// An empty [Characters] containing no characters.
+ static const Characters empty = StringCharacters("");
+
/// Creates a [Characters] allowing iteration of
/// the characters of [string].
- factory Characters(String string) = StringCharacters;
+ ///
+ /// Returns [empty] if [string] is empty.
+ factory Characters(String string) =>
+ string.isEmpty ? empty : StringCharacters(string);
/// The string to iterate over.
String get string;
diff --git a/lib/src/characters_impl.dart b/lib/src/characters_impl.dart
index 0791ec0..389400c 100644
--- a/lib/src/characters_impl.dart
+++ b/lib/src/characters_impl.dart
@@ -12,9 +12,6 @@
///
/// Backed by a single string.
class StringCharacters extends Iterable<String> implements Characters {
- // Try to avoid allocating more empty grapheme clusters.
- static const StringCharacters _empty = StringCharacters("");
-
@override
final String string;
@@ -219,7 +216,7 @@
Characters _skip(int count) {
var start = _skipIndices(count, 0, null);
- if (start == string.length) return _empty;
+ if (start == string.length) return Characters.empty;
return StringCharacters(string.substring(start));
}
@@ -240,12 +237,12 @@
RangeError.checkNotNegative(start, "start");
if (end == null) return _skip(start);
if (end < start) throw RangeError.range(end, start, null, "end");
- if (end == start) return _empty;
+ if (end == start) return Characters.empty;
if (start == 0) return _take(end);
if (string.isEmpty) return this;
var breaks = Breaks(string, 0, string.length, stateSoTNoBreak);
var startIndex = _skipIndices(start, 0, breaks);
- if (startIndex == string.length) return _empty;
+ if (startIndex == string.length) return Characters.empty;
var endIndex = _skipIndices(end - start, start, breaks);
return StringCharacters(string.substring(startIndex, endIndex));
}
@@ -276,13 +273,13 @@
while ((index = breaks.nextBreak()) >= 0) {
if (!test(string.substring(startIndex, index))) {
if (startIndex == 0) return this;
- if (startIndex == stringLength) return _empty;
+ if (startIndex == stringLength) return Characters.empty;
return StringCharacters(string.substring(startIndex));
}
startIndex = index;
}
}
- return _empty;
+ return Characters.empty;
}
@override
@@ -293,7 +290,7 @@
var endIndex = 0;
while ((index = breaks.nextBreak()) >= 0) {
if (!test(string.substring(endIndex, index))) {
- if (endIndex == 0) return _empty;
+ if (endIndex == 0) return Characters.empty;
return StringCharacters(string.substring(0, endIndex));
}
endIndex = index;
@@ -305,7 +302,7 @@
@override
Characters where(bool Function(String) test) {
var string = super.where(test).join();
- if (string.isEmpty) return _empty;
+ if (string.isEmpty) return Characters.empty;
return StringCharacters(super.where(test).join());
}
@@ -326,12 +323,12 @@
endIndex = index;
count--;
} else {
- return _empty;
+ return Characters.empty;
}
}
if (endIndex > 0) return StringCharacters(string.substring(0, endIndex));
}
- return _empty;
+ return Characters.empty;
}
@override
@@ -343,18 +340,20 @@
while ((index = breaks.nextBreak()) >= 0) {
if (!test(string.substring(index, end))) {
if (end == string.length) return this;
- return end == 0 ? _empty : StringCharacters(string.substring(0, end));
+ return end == 0
+ ? Characters.empty
+ : StringCharacters(string.substring(0, end));
}
end = index;
}
}
- return _empty;
+ return Characters.empty;
}
@override
Characters takeLast(int count) {
RangeError.checkNotNegative(count, "count");
- if (count == 0) return _empty;
+ if (count == 0) return Characters.empty;
if (string.isNotEmpty) {
var breaks = BackBreaks(string, string.length, 0, stateEoTNoBreak);
var startIndex = string.length;
@@ -382,7 +381,7 @@
var start = string.length;
while ((index = breaks.nextBreak()) >= 0) {
if (!test(string.substring(index, start))) {
- if (start == string.length) return _empty;
+ if (start == string.length) return Characters.empty;
return StringCharacters(string.substring(start));
}
start = index;