#pragma once #include "cartesian_product.h" #include "concatenate.h" #include "enumerate.h" #include "filtering.h" #include "mapped.h" #include "zip.h" #include #include #include #include namespace NFuncTools { using ::Enumerate; using ::Reversed; using ::Zip; using ::Concatenate; using ::CartesianProduct; template auto Range(TValue from, TValue to, TValue step) { return xrange(from, to, step); } template auto Range(TValue from, TValue to) { return xrange(from, to); } template auto Range(TValue to) { return xrange(to); } //! Usage: for (i32 x : Map([](i32 x) { return x * x; }, a)) {...} template auto Map(TMapper&& mapper, TContainerOrRef&& container) { return ::MakeMappedRange(std::forward(container), std::forward(mapper)); } //! Usage: for (auto i : Map(floats)) {...} template auto Map(TContainerOrRef&& container) { return Map([](const auto& x) { return TMapResult(x); }, std::forward(container)); } //! Usage: for (i32 x : Filter(predicate, container)) {...} template auto Filter(TPredicate&& predicate, TContainerOrRef&& container) { return ::MakeFilteringRange(std::forward(container), std::forward(predicate)); } }