Collection $filterEndPoint = filter( 'endpoint' )->using( 'wp_unslash' ); // :: Collection -> Collection $decodeData = filter( 'data' )->using( Json::toCollection() )->defaultTo( 'wpml_collect' ); // :: Collection -> Either::Left( string ) | Either::Right( Collection ) $validateData = validate( 'data' )->using( Logic::isNotNull() )->error( 'Invalid json data' ); // $handleRequest :: Collection -> Either::Left(string) | Either::Right(mixed) $handleRequest = function ( Collection $postData ) { try { return Maybe::of( $postData->get( 'endpoint' ) ) ->map( pipe( make(), Lst::makePair( Fns::__, 'run' ) ) ) ->map( execute( Fns::__, [ ':data' => $postData->get( 'data' ) ] ) ) ->getOrElse( Either::left( 'End point not found' ) ); } catch ( \Exception $e ) { return Either::left( $e->getMessage() ); } }; Hooks::onAction( 'wp_ajax_wpml_action' ) ->then( System::getPostData() ) // Either::right(Collection) ->then( $filterEndPoint ) ->then( Nonce::verifyEndPoint() ) ->then( $decodeData ) ->then( $validateData ) ->then( $handleRequest ) ->then( 'wp_send_json_success' ) ->onError( 'wp_send_json_error' ); } }