1
0
forked from Alepha/Alepha

Function adapter which reverses arguments.

This commit is contained in:
2025-09-07 17:40:33 -04:00
parent e315d63d13
commit c352117d16
4 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,55 @@
static_assert( __cplusplus >= 2023'02 );
#pragma once
#include <Alepha/Alepha.h>
#include <Alepha/Concepts.h>
#include <Alepha/Utility/tuple_algorithms.h>
namespace Alepha::Hydrogen::Functional ::detail:: reverse_arguments_m
{
inline namespace exports
{
auto reverse_arguments( Concepts::Functional auto func );
}
template< typename Result, typename ... Arguments >
auto
build_reverse_tuple_lambda( std::function< Result ( Arguments... ) > func )
{
return std::function
{
[func]( decltype( Utility::tuple::reverse( std::declval< std::tuple< Arguments... > >() ) ) params )
{
return std::apply( func, Utility::tuple::reverse( params ) );
}
};
}
template< typename ReturnType, typename ... Arguments >
auto
bind_args_to_tuple_function( std::function< ReturnType ( std::tuple< Arguments... > ) > func )
{
return std::function
{
[func]( Arguments... args ) -> ReturnType
{
return func( std::tuple{ args... } );
}
};
}
auto
exports::reverse_arguments( Concepts::Functional auto func )
{
return bind_args_to_tuple_function( build_reverse_tuple_lambda( std::function{ func } ) );
}
}
namespace Alepha::Hydrogen::Functional::inline exports::inline reverse_arguments_m
{
using namespace detail::reverse_arguments_m::exports;
}