42 template<
template<
typename U>
class Container,
typename T1,
typename T2,
typename F>
57 template<
typename T1,
typename T2,
59 template<
typename U1,
typename U2>
class Pair =
QPair>
64 {
return {
t1,
t2}; });
69 template<
typename Res,
typename T>
75 template<
typename Res,
typename T>
87 template<
template<
typename...>
class Container,
typename...
Args>
99 template<
typename Container,
typename T>
105 template<
template<
typename>
class Container,
typename U,
typename T>
123 using FRet_t = std::decay_t<
decltype (std::invoke (f, *
c.begin ()))>;
124 static_assert (!std::is_same<void, FRet_t> {},
"The function shall not return void.");
142 template<
typename Container,
typename F>
154 template<
typename T,
template<
typename U>
class Container,
typename F>
158 for (
const auto&
item :
c)
159 if (std::invoke (f,
item))
164 template<
template<
typename>
class Container,
typename T>
169 std::copy (
cont.begin (),
cont.end (), std::back_inserter (
result));
183 template<
typename Cont,
typename F>
186 return Concat (
Map (std::forward<Cont> (
c), std::forward<F> (f)));
189 template<
template<
typename>
class Container,
typename T>
211 template<
typename Cont>
214 std::sort (
cont.begin (),
cont.end ());
215 return std::forward<Cont> (
cont);
218 constexpr auto Id = [] (
auto&&
t) ->
decltype (
auto) {
return std::forward<decltype (t)> (
t); };
223 return [
r] (
const auto&
left,
const auto&
right) {
return std::invoke (
r,
left) < std::invoke (
r,
right); };
229 return [
r] (
const auto&
left,
const auto&
right) {
return std::invoke (
r,
left) == std::invoke (
r,
right); };
232 constexpr auto Apply = [] (
const auto&
t) {
return t (); };
234 constexpr auto Fst = [] (
const auto& pair) {
return pair.first; };
236 constexpr auto Snd = [] (
const auto& pair) {
return pair.second; };
241 return [f = std::forward<F> (f)] (
const auto& pair) {
return std::invoke (f, pair.first); };
247 return [f = std::forward<F> (f)] (
const auto& pair) {
return std::invoke (f, pair.second); };
auto MapImpl(Container &&c, F f)
constexpr bool IsSimpleContainer()
constexpr bool IsNotBrokenSFINAE_v
void Append(Res &result, T &&val, decltype(result.push_back(std::forward< T >(val))) *=nullptr)
Container< T > Filter(const Container< T > &c, F f)
auto ConcatMap(Cont &&c, F &&f)
Container< T > Concat(const Container< Container< T > > &containers)
auto MapAs(Container &&c, F &&f)
auto ZipWith(const Container< T1 > &c1, const Container< T2 > &c2, F f) -> WrapType_t< Container< std::decay_t< std::result_of_t< F(T1, T2)> > > >
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)
Container< Container< T > > SplitInto(size_t numChunks, const Container< T > &container)
static const size_t ArgsCount