diff --git a/src/string.cc b/src/string.cc index 870cdf9e..23457413 100644 --- a/src/string.cc +++ b/src/string.cc @@ -94,4 +94,21 @@ bool prefix_match(const String& str, const String& prefix) return true; } +bool subsequence_match(const String& str, const String& subseq) +{ + auto it = str.begin(); + for (auto& c : subseq) + { + if (it == str.end()) + return false; + while (*it != c) + { + if (++it == str.end()) + return false; + } + ++it; + } + return true; +} + } diff --git a/src/string.hh b/src/string.hh index 25e051dc..68317901 100644 --- a/src/string.hh +++ b/src/string.hh @@ -113,6 +113,7 @@ String to_string(const StronglyTypedNumber& val) } bool prefix_match(const String& str, const String& prefix); +bool subsequence_match(const String& str, const String& subseq); } diff --git a/src/unit_tests.cc b/src/unit_tests.cc index 589a83fe..e49f7b3a 100644 --- a/src/unit_tests.cc +++ b/src/unit_tests.cc @@ -141,6 +141,11 @@ void test_string() kak_assert(prefix_match("tchou kanaky", "tchou kanaky")); kak_assert(prefix_match("tchou kanaky", "t")); kak_assert(not prefix_match("tchou kanaky", "c")); + + kak_assert(subsequence_match("tchou kanaky", "tknky")); + kak_assert(subsequence_match("tchou kanaky", "knk")); + kak_assert(subsequence_match("tchou kanaky", "tchou kanaky")); + kak_assert(not subsequence_match("tchou kanaky", "tchou kanaky")); } void test_keys()