44#include " concepts.hpp"
55#include " cycle.hpp"
66#include " filter.hpp"
7+ #include " filter_map.hpp"
78#include " inspect.hpp"
89#include " map.hpp"
910#include " moving_window.hpp"
1011#include " take.hpp"
1112#include " zip.hpp"
1213
1314#include < stdexcept>
15+ #include < type_traits>
1416#include < vector>
1517
1618namespace rusty_iterators ::interface
@@ -20,6 +22,7 @@ using concepts::AnyFunctor;
2022using concepts::Comparable;
2123using concepts::EqFunctor;
2224using concepts::FilterFunctor;
25+ using concepts::FilterMapFunctor;
2326using concepts::FoldFunctor;
2427using concepts::ForEachFunctor;
2528using concepts::Indexable;
@@ -33,6 +36,7 @@ using iterator::Chain;
3336using iterator::CopyCycle;
3437using iterator::CycleType;
3538using iterator::Filter;
39+ using iterator::FilterMap;
3640using iterator::Inspect;
3741using iterator::Map;
3842using iterator::MovingWindow;
@@ -88,6 +92,11 @@ class IterInterface
8892 requires FilterFunctor<T, Functor>
8993 [[nodiscard]] auto filter (Functor&& f) -> Filter<T, Functor, Derived>;
9094
95+ template <class Functor >
96+ requires FilterMapFunctor<T, typename std::invoke_result_t <Functor, T>::value_type, Functor>
97+ [[nodiscard]] auto filterMap (Functor&& f)
98+ -> FilterMap<T, typename std::invoke_result_t<Functor, T>::value_type, Functor, Derived>;
99+
91100 template <class B , class Functor >
92101 requires FoldFunctor<B, T, Functor>
93102 [[nodiscard]] auto fold (B&& init, Functor&& f) -> B;
@@ -277,6 +286,17 @@ auto rusty_iterators::interface::IterInterface<T, Derived>::filter(Functor&& f)
277286 return Filter<T, Functor, Derived>{std::forward<Derived>(self ()), std::forward<Functor>(f)};
278287}
279288
289+ template <class T , class Derived >
290+ template <class Functor >
291+ requires rusty_iterators::concepts::FilterMapFunctor<
292+ T, typename std::invoke_result_t <Functor, T>::value_type, Functor>
293+ auto rusty_iterators::interface::IterInterface<T, Derived>::filterMap(Functor&& f)
294+ -> FilterMap<T, typename std::invoke_result_t <Functor, T>::value_type, Functor, Derived>
295+ {
296+ return FilterMap<T, typename std::invoke_result_t <Functor, T>::value_type, Functor, Derived>{
297+ std::forward<Derived>(self ()), std::forward<Functor>(f)};
298+ }
299+
280300template <class T , class Derived >
281301template <class B , class Functor >
282302 requires rusty_iterators::concepts::FoldFunctor<B, T, Functor>
0 commit comments