@@ -61,6 +61,13 @@ using iterator::Take;
6161using iterator::Zip;
6262using iterator::ZipLongest;
6363
64+ enum class Ordering : uint8_t
65+ {
66+ Equal,
67+ Less,
68+ Greater,
69+ };
70+
6471template <class T , class Derived >
6572class IterInterface
6673{
@@ -85,6 +92,9 @@ class IterInterface
8592 requires AllFunctor<T, Functor>
8693 [[nodiscard]] auto all (Functor&& f) -> bool;
8794
95+ template <class Other >
96+ [[nodiscard]] auto cmp (Other&& it) -> Ordering;
97+
8898 [[nodiscard]] auto collect () -> std::vector<T>;
8999 [[nodiscard]] auto count () -> size_t;
90100
@@ -229,7 +239,7 @@ template <class Functor>
229239 requires rusty_iterators::concepts::AnyFunctor<T, Functor>
230240auto rusty_iterators::interface::IterInterface<T, Derived>::any(Functor&& f) -> bool // NOLINT
231241{
232- auto anyf = [f = std::forward<Functor>(f)](auto acc, auto x) {
242+ auto anyf = [f = std::forward<Functor>(f)](auto acc, auto x) -> std::expected< bool , bool > {
233243 return f (x) ? std::expected<bool , bool >{true } : std::unexpected{false };
234244 };
235245 return self ().tryFold (false , std::move (anyf));
@@ -240,12 +250,31 @@ template <class Functor>
240250 requires rusty_iterators::concepts::AllFunctor<T, Functor>
241251auto rusty_iterators::interface::IterInterface<T, Derived>::all(Functor&& f) -> bool // NOLINT
242252{
243- auto allf = [f = std::forward<Functor>(f)](auto acc, auto x) {
253+ auto allf = [f = std::forward<Functor>(f)](auto acc, auto x) -> std::expected< bool , bool > {
244254 return !f (x) ? std::expected<bool , bool >{false } : std::unexpected{true };
245255 };
246256 return self ().tryFold (true , std::move (allf));
247257}
248258
259+ template <class T , class Derived >
260+ template <class Other >
261+ auto rusty_iterators::interface::IterInterface<T, Derived>::cmp(Other&& it) -> Ordering
262+ {
263+ auto func = [](auto acc, auto x) -> std::expected<Ordering, Ordering> {
264+ auto left = std::get<0 >(x);
265+ auto right = std::get<1 >(x);
266+
267+ if (left > right)
268+ return std::expected<Ordering, Ordering>{Ordering::Greater};
269+
270+ if (left < right)
271+ return std::expected<Ordering, Ordering>{Ordering::Less};
272+
273+ return std::unexpected{Ordering::Equal};
274+ };
275+ return self ().zipLongest (std::forward<Other>(it)).tryFold (Ordering::Equal, std::move (func));
276+ }
277+
249278template <class T , class Derived >
250279auto rusty_iterators::interface::IterInterface<T, Derived>::collect() -> std::vector<T>
251280{
0 commit comments