diff --git a/Sources/AOC2018/tools.swift b/Sources/AOC2018/tools.swift index 50dccab..bc4f942 100644 --- a/Sources/AOC2018/tools.swift +++ b/Sources/AOC2018/tools.swift @@ -27,6 +27,14 @@ struct Tools { } return retVal } + + // Assumes THE string is 'polymer' + static func stringIndexRange(withString str: String, fromRange range: Range) -> Range { + let myrange = Range(uncheckedBounds: (lower: max(0, min(str.length, range.lowerBound)), upper: min(str.length, max(0, range.upperBound)))) + let start = str.index(str.startIndex, offsetBy: myrange.lowerBound) + let end = str.index(start, offsetBy: myrange.upperBound - myrange.lowerBound) + return start ..< end + } } extension Character { @@ -39,7 +47,41 @@ extension Character { } extension StringProtocol { + // var string: String { return String(self) } + var ascii: [UInt32] { return compactMap { $0.ascii } } + + // subscript(offset: Int) -> Element { + // return self[index(startIndex, offsetBy: offset)] + // } +} + +extension String { + + var length: Int { + return count + } + + subscript (i: Int) -> String { + return self[i ..< i + 1] + } + + func substring(fromIndex: Int) -> String { + return self[min(fromIndex, length) ..< length] + } + + func substring(toIndex: Int) -> String { + return self[0 ..< max(0, toIndex)] + } + + subscript (r: Range) -> String { + let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)), + upper: min(length, max(0, r.upperBound)))) + let start = index(startIndex, offsetBy: range.lowerBound) + let end = index(start, offsetBy: range.upperBound - range.lowerBound) + return String(self[start ..< end]) + } + }