diff --git a/AK/Find.h b/AK/Find.h index cb5ff75e377..1057650c45a 100644 --- a/AK/Find.h +++ b/AK/Find.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include @@ -36,10 +37,21 @@ requires(requires(TIterator it) { it.index(); }) return find_if(first, last, [&](T const& entry) { return Traits::equals(entry, value); }).index(); } +template +[[nodiscard]] constexpr auto find_value(Container const& container, TUnaryPredicate&& pred) + -> Optional +{ + auto it = find_if(container.begin(), container.end(), forward(pred)); + if (it != container.end()) + return *it; + return {}; +} + } #if USING_AK_GLOBALLY using AK::find; using AK::find_if; using AK::find_index; +using AK::find_value; #endif diff --git a/Libraries/LibWeb/WebDriver/Actions.cpp b/Libraries/LibWeb/WebDriver/Actions.cpp index 848f1e1dca1..04a398b1cb8 100644 --- a/Libraries/LibWeb/WebDriver/Actions.cpp +++ b/Libraries/LibWeb/WebDriver/Actions.cpp @@ -901,13 +901,11 @@ static KeyCodeData key_code_data(u32 code_point) { 0xE027, {}, UIEvents::KeyCode::Key_Minus, UIEvents::KeyModifier::Mod_Keypad }, }); - auto it = find_if(key_code_data.begin(), key_code_data.end(), [&](auto const& data) { + auto data = find_value(key_code_data, [&](auto const& data) { return data.key == code_point || data.alternate_key == code_point; }); - if (it == key_code_data.end()) - return { .key = code_point }; - return *it; + return data.value_or({ .key = code_point }); } // https://w3c.github.io/webdriver/#dfn-shifted-character diff --git a/Libraries/LibWebView/Autocomplete.cpp b/Libraries/LibWebView/Autocomplete.cpp index 8fe77a82d02..64c6f1382ab 100644 --- a/Libraries/LibWebView/Autocomplete.cpp +++ b/Libraries/LibWebView/Autocomplete.cpp @@ -29,14 +29,9 @@ ReadonlySpan autocomplete_engines() Optional find_autocomplete_engine_by_name(StringView name) { - auto it = AK::find_if(builtin_autocomplete_engines.begin(), builtin_autocomplete_engines.end(), - [&](auto const& engine) { - return engine.name == name; - }); - - if (it == builtin_autocomplete_engines.end()) - return {}; - return *it; + return find_value(builtin_autocomplete_engines, [&](auto const& engine) { + return engine.name == name; + }); } Autocomplete::Autocomplete() = default; diff --git a/Libraries/LibWebView/SearchEngine.cpp b/Libraries/LibWebView/SearchEngine.cpp index ec6a1ec7b59..65fae843f51 100644 --- a/Libraries/LibWebView/SearchEngine.cpp +++ b/Libraries/LibWebView/SearchEngine.cpp @@ -30,28 +30,16 @@ ReadonlySpan search_engines() Optional find_search_engine_by_name(StringView name) { - auto it = AK::find_if(builtin_search_engines.begin(), builtin_search_engines.end(), - [&](auto const& engine) { - return engine.name == name; - }); - - if (it == builtin_search_engines.end()) - return {}; - - return *it; + return find_value(builtin_search_engines, [&](auto const& engine) { + return engine.name == name; + }); } Optional find_search_engine_by_query_url(StringView query_url) { - auto it = AK::find_if(builtin_search_engines.begin(), builtin_search_engines.end(), - [&](auto const& engine) { - return engine.query_url == query_url; - }); - - if (it == builtin_search_engines.end()) - return {}; - - return *it; + return find_value(builtin_search_engines, [&](auto const& engine) { + return engine.query_url == query_url; + }); } String format_search_query_for_display(StringView query_url, StringView query) diff --git a/Tests/AK/TestFind.cpp b/Tests/AK/TestFind.cpp index bee248d7998..8eb6a6630f1 100644 --- a/Tests/AK/TestFind.cpp +++ b/Tests/AK/TestFind.cpp @@ -51,3 +51,14 @@ TEST_CASE(should_return_index_to_first_predicate_matching_value_in_container) EXPECT(4 == AK::find_index(a.begin(), a.end(), 0)); } + +TEST_CASE(find_value) +{ + static constexpr Array array { 1, 2, 3, 4, 0, 6, 7, 8, 0, 0 }; + + auto value = find_value(array, [](auto value) { return value > 5; }); + EXPECT_EQ(value, 6); + + value = find_value(array, [](auto value) { return value == 12389; }); + EXPECT(!value.has_value()); +}