//
//  String.swift
//  Example
//
//  Copyright 2021 Twitter, Inc.
//  SPDX-License-Identifier: Apache-2.0
//

import Foundation

extension String {
    @inlinable
    public var length: Int {
        (self as NSString).length
    }

    @inlinable
    public func substring(with range: NSRange) -> String {
        (self as NSString).substring(with: range)
    }

    public func substring(with result: NSTextCheckingResult, at index: Int) -> String? {
        guard index < result.numberOfRanges else {
            return nil
        }
        let range = result.range(at: index)
        guard range.location != NSNotFound else {
            return nil
        }
        return substring(with: result.range(at: index))
    }

    public func firstMatch(pattern: String,
                    options: NSRegularExpression.Options = [],
                    range: NSRange? = nil) -> NSTextCheckingResult?
    {
        guard let regularExpression = try? NSRegularExpression(pattern: pattern, options: options) else {
            return nil
        }
        let range = range ?? NSRange(location: 0, length: length)
        return regularExpression.firstMatch(in: self, options: [], range: range)
    }

    public func matches(pattern: String,
                 options: NSRegularExpression.Options = [],
                 range: NSRange? = nil) -> [NSTextCheckingResult]
    {
        guard let regularExpression = try? NSRegularExpression(pattern: pattern, options: options) else {
            return []
        }
        let range = range ?? NSRange(location: 0, length: length)
        return regularExpression.matches(in: self, options: [], range: range)
    }
}
