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;