From 159dbcf28e1e38aed555eadc9877bc8d055c7ad3 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 7 Mar 2016 13:35:25 -0500 Subject: [PATCH] Formula engine: New take_while function Returns all elements up to the first one failing the condition --- src/formula_function.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/formula_function.cpp b/src/formula_function.cpp index 0ba6bc91b81b..9509b664a883 100644 --- a/src/formula_function.cpp +++ b/src/formula_function.cpp @@ -828,6 +828,25 @@ class map_function : public function_expression { } }; +class take_while_function : public function_expression { +public: + explicit take_while_function(const args_list& args) + : function_expression("take_while", args, 2, 2) + {} +private: + variant execute(const formula_callable& variables, formula_debugger *fdb) const { + const variant& items = args()[0]->evaluate(variables, fdb); + variant_iterator it = items.begin(); + for(; it != items.end(); ++it) { + const variant matches = args().back()->evaluate(formula_variant_callable_with_backup(*it, variables),fdb); + if (!matches.as_bool()) + break; + } + std::vector result(items.begin(), it); + return variant(&result); + } +}; + class zip_function : public function_expression { public: explicit zip_function(const args_list& args) @@ -1294,6 +1313,7 @@ functions_map& get_functions_map() { FUNCTION(find); FUNCTION(map); FUNCTION(zip); + FUNCTION(take_while); FUNCTION(reduce); FUNCTION(sum); FUNCTION(head);