     ///
     func range(from utf16Range: Range<String.UTF16View.Index>) -> Range<String.Index> {
 
-        let start = self.findValidUTF8LowerBound(for: utf16Range)
-        let end = self.findValidUTF8UpperBound(for: utf16Range)
+        let start = self.findValidLowerBound(for: utf16Range)
+        let end = self.findValidUpperBound(for: utf16Range)
 
         return start ..< end
     }

    ///
    /// - Returns: A valid upper bound represented as a `String.Index`
    ///
    private func findValidUTF8UpperBound(for utf16Range: Range<String.UTF16View.Index>) -> String.Index {

        guard self.utf16.count >= utf16Range.upperBound.encodedOffset else {
            return String.Index(encodedOffset: self.utf16.count)
        }

        return findValidUTF8Bound(for: utf16Range.upperBound, using: +)
    }

    /// Finds a valid UTF-8 `String.Index` matching the bound of a `String.UTF16View.Index`

    ///
    /// - Returns: A corresponding `String.Index`
    ///
    private func findValidBound(for bound: String.UTF16View.Index, using method: (Int, Int) -> Int) -> String.Index {

        var newBound = bound.samePosition(in: self) // nil if we're inside a grapheme cluster
        var i = 1
