36 template<
template<
typename U>
class Container,
typename T1,
typename T2,
typename F>
51 template<
typename T1,
typename T2,
53 template<
typename U1,
typename U2>
class Pair =
QPair>
58 {
return {
t1,
t2}; });
63 template<
typename Res,
typename T>
66 if constexpr (
requires {
result.push_back (std::forward<T> (
val)); })
72 template<
typename Container,
typename T>
78 template<
template<
typename...>
class Container,
typename U,
typename T>
84 template<
typename ResultContainer,
typename Container,
typename F>
103 template<
typename Container,
typename F>
104 auto Map (
Container&&
c,
F&& f)
noexcept (
noexcept (std::is_nothrow_invocable_v<
F,
decltype (*
c.begin ())>))
106 using FRet_t = std::decay_t<
decltype (std::invoke (f, *
c.begin ()))>;
111 auto MapAs (
Container&&
c,
F&& f)
noexcept (
noexcept (std::is_nothrow_invocable_v<
F,
decltype (*
c.begin ())>))
113 using FRet_t = std::decay_t<
decltype (std::invoke (f, *
c.begin ()))>;
117 template<
typename T,
template<
typename U>
class Container,
typename F>
121 for (
const auto&
item :
c)
122 if (std::invoke (f,
item))
127 template<
template<
typename>
class Container,
typename T>
132 decltype (
result.size ()) size {};
134 size +=
cont.size ();
138 std::copy (
cont.begin (),
cont.end (), std::back_inserter (
result));
142 template<
template<
typename>
class Container,
typename T>
147 decltype (
result.size ()) size {};
149 size +=
cont.size ();
153 std::move (
cont.begin (),
cont.end (), std::back_inserter (
result));
167 template<
typename Cont,
typename F>
170 return Concat (
Map (std::forward<Cont> (
c), std::forward<F> (f)));
173 template<
template<
typename>
class Container,
typename T>
195 template<
typename Cont>
198 std::sort (
cont.begin (),
cont.end ());
199 return std::forward<Cont> (
cont);
202 constexpr auto Id = [] (
auto&&
t) ->
decltype (
auto) {
return std::forward<decltype (t)> (
t); };
207 return [
r] (
const auto&
left,
const auto&
right) {
return std::invoke (
r,
left) < std::invoke (
r,
right); };
213 return [
r] (
const auto&
left,
const auto&
right) {
return std::invoke (
r,
left) == std::invoke (
r,
right); };
216 constexpr auto Apply = [] (
const auto&
t) {
return t (); };
218 constexpr auto Fst = [] (
const auto& pair) {
return pair.first; };
220 constexpr auto Snd = [] (
const auto& pair) {
return pair.second; };
225 return [f = std::forward<F> (f)] (
const auto& pair) {
return std::invoke (f, pair.first); };
231 return [f = std::forward<F> (f)] (
const auto& pair) {
return std::invoke (f, pair.second); };
void Append(Res &result, T &&val) noexcept
auto MapImpl(Container &&c, F f)
Container< T > Filter(const Container< T > &c, F f)
constexpr auto ZipWith(Tup1 &&tup1, auto &&sep, Tup2 &&tup2) noexcept
auto ConcatMap(Cont &&c, F &&f)
Container< T > Concat(const Container< Container< T > > &containers)
typename WrapType< T >::type WrapType_t
decltype(auto) Sorted(Cont &&cont)
auto Zip(const Container< T1 > &c1, const Container< T2 > &c2) -> Container< Pair< T1, T2 > >
auto Map(Container &&c, F &&f) noexcept(noexcept(std::is_nothrow_invocable_v< F, decltype(*c.begin())>))
auto MapAs(Container &&c, F &&f) noexcept(noexcept(std::is_nothrow_invocable_v< F, decltype(*c.begin())>))
Container< Container< T > > SplitInto(size_t numChunks, const Container< T > &container)