@@ -16,6 +16,7 @@ using Item = std::reference_wrapper<const typename Container::value_type>;
1616namespace rusty_iterators ::iterator
1717{
1818using concepts::FoldFunctor;
19+ using concepts::Multiplyable;
1920using concepts::Summable;
2021
2122template <class Container >
@@ -32,6 +33,10 @@ class LazyIterator : public interface::IterInterface<Item<Container>, LazyIterat
3233 auto next () -> std::optional<T>;
3334 [[nodiscard]] auto sizeHint () const -> std::optional<size_t>;
3435
36+ template <class R = RawT>
37+ requires Multiplyable<R>
38+ [[nodiscard]] auto product () -> std::optional<R>;
39+
3540 template <class R = RawT>
3641 requires Summable<R>
3742 [[nodiscard]] auto sum () -> R;
@@ -62,11 +67,20 @@ auto rusty_iterators::iterator::LazyIterator<Container>::sizeHint() const -> std
6267 return end - ptr;
6368}
6469
70+ template <class Container >
71+ requires std::ranges::range<Container>
72+ template <class R >
73+ requires rusty_iterators::concepts::Multiplyable<R>
74+ auto rusty_iterators::iterator::LazyIterator<Container>::product() -> std::optional<R>
75+ {
76+ return this ->map ([](auto x) { return x.get (); }).product ();
77+ }
78+
6579template <class Container >
6680 requires std::ranges::range<Container>
6781template <class R >
6882 requires rusty_iterators::concepts::Summable<R>
6983auto rusty_iterators::iterator::LazyIterator<Container>::sum() -> R
7084{
71- return this ->fold (RawT{}, [](auto acc, auto x) { return acc + x ; });
85+ return this ->map ( [](auto x) { return x. get () ; }). sum ( );
7286}
0 commit comments