Merge pull request #11159 from airspeedswift/4.0-substring-filter

[4.0]Have Substring.filter return a String
diff --git a/stdlib/public/core/Substring.swift.gyb b/stdlib/public/core/Substring.swift.gyb
index 792cf4c..560f9c1 100644
--- a/stdlib/public/core/Substring.swift.gyb
+++ b/stdlib/public/core/Substring.swift.gyb
@@ -434,6 +434,12 @@
   public func uppercased() -> String {
     return String(self).uppercased()
   }
+  
+  public func filter(
+  _ isIncluded: (Element) throws -> Bool
+  ) rethrows -> String {
+      return try String(self.lazy.filter(isIncluded))
+  }
 }
 
 extension Substring : TextOutputStream {
diff --git a/test/stdlib/subString.swift b/test/stdlib/subString.swift
index 8afee2d..c316274 100644
--- a/test/stdlib/subString.swift
+++ b/test/stdlib/subString.swift
@@ -92,6 +92,14 @@
 		["apple", "pen", "pen", "pineapple"])
 }
 
+SubstringTests.test("Filter") {
+	var name = "😂Edward Woodward".dropFirst()
+	var filtered = name.filter { $0 != "d" }
+	expectType(Substring.self, &name)
+	expectType(String.self, &filtered)
+	expectEqual("Ewar Woowar", filtered)
+}
+
 SubstringTests.test("CharacterView") {
   let s = "abcdefg"
   var t = s.characters.dropFirst(2)