[swift-evolution] [Proposal]Simple pattern matching with Horspool algorithm

Susan Cheng susan.doggie at gmail.com
Mon May 16 23:32:04 CDT 2016


public extension CollectionType where Index : RandomAccessIndexType {



    @warn_unused_result

    func matchWith<C : CollectionType where C.Index : BidirectionalIndexType,
C.Generator.Element == Generator.Element>(pattern: C, @noescape
isEquivalent: (Generator.Element, Generator.Element) throws -> Bool)
rethrows -> Index? {



        let pattern_count = pattern.count.toIntMax()

        if count.toIntMax() < pattern_count {

            return nil

        }

        let reverse_pattern = pattern.reverse()

        var cursor = startIndex.advancedBy(numericCast(pattern_count - 1))

        while cursor < endIndex {

            let left = startIndex...cursor

            let pair = zip(left.reverse(), reverse_pattern)

            guard let not_match = try pair.firstOf({ try
!isEquivalent(self[$0],
$1) }) else {

                return cursor.advancedBy(numericCast(1 - pattern_count))

            }

            if let pos = try reverse_pattern.dropFirst().indexOf({ try
isEquivalent(self[not_match.0], $0) }) {

                let offset = reverse_pattern.startIndex.distanceTo(pos).
toIntMax()

                cursor = not_match.0.advancedBy(numericCast(offset), limit:
endIndex)

            } else {

                cursor = not_match.0.advancedBy(numericCast(pattern_count),
limit: endIndex)

            }

        }

        if try self.reverse().startsWith(reverse_pattern, isEquivalent:
isEquivalent) {

            return endIndex.advancedBy(numericCast(-pattern_count))

        }

        return nil

    }

}


public extension CollectionType where Index : RandomAccessIndexType,
Generator.Element : Equatable {



    @warn_unused_result

    func matchWith<C : CollectionType where C.Index : BidirectionalIndexType,
C.Generator.Element == Generator.Element>(pattern: C) -> Index? {

        return self.matchWith(pattern) { $0 == $1 }

    }

}


with this simplify version of Horspool algorithm, it can speed up searching
in any random access CollectionType (better than brute force searching).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160517/ddd6e7dd/attachment.html>


More information about the swift-evolution mailing list