14 #ifndef ZYPPNG_MONADIC_ASYNCRESULT_H_INCLUDED 15 #define ZYPPNG_MONADIC_ASYNCRESULT_H_INCLUDED 17 #include <zypp-core/zyppng/meta/TypeTraits> 18 #include <zypp-core/zyppng/meta/FunctionTraits> 19 #include <zypp-core/zyppng/meta/Functional> 20 #include <zypp-core/zyppng/async/AsyncOp> 27 template<
typename Callback,
typename MsgType,
typename = std::
void_t<> >
30 template<
typename Callback,
typename MsgType >
33 std::enable_if_t< is_async_op_v<Callback> >,
34 decltype ( std::declval<remove_smart_ptr_t<Callback>>()( std::declval<MsgType>()) )
36 > :
public std::true_type{};
42 template<
typename Callback,
typename MsgType >
45 template<
typename Callback,
typename MsgType,
typename = std::
void_t<> >
48 template<
typename Callback,
typename MsgType >
51 std::enable_if_t< !is_async_op_v<Callback> >,
52 std::enable_if_t< !std::is_same_v< void, decltype ( std::declval<Callback>()(std::declval<MsgType>())) > > >
53 > :
public std::true_type{};
58 template<
typename Callback,
typename MsgType,
typename = std::
void_t<> >
62 template <
typename Callback,
typename Arg>
66 template<
typename Callback,
typename MsgType,
typename = std::
void_t<> >
69 template<
typename Callback,
typename MsgType >
72 std::enable_if_t< is_sync_monad_cb<Callback, MsgType>::value >,
73 std::enable_if_t< callback_returns_async_op<Callback, MsgType>::value >>
74 > :
public std::true_type{};
76 template<
typename Callback,
typename MsgType,
typename = std::
void_t<> >
79 template<
typename Callback,
typename MsgType >
82 std::enable_if_t< is_sync_monad_cb<Callback, MsgType>::value >,
83 std::enable_if_t< !callback_returns_async_op<Callback, MsgType>::value > >
84 > :
public std::true_type{};
89 template <
typename Callback,
typename Arg>
95 template <
typename Callback,
typename Arg>
119 template <
typename T>
122 template <
typename T>
125 template <
typename T>
130 template <
typename PrevRes,
typename CallbackOp,
typename AOpRes =
typename CallbackOp::value_type >
133 static_assert( !is_async_op_v<AOpRes>,
"A AsyncResult can never return a async value" );
134 static_assert( !is_async_op_v<PrevRes>,
"A incoming value can never be a async value" );
154 _myTask->onReady( [
this] ( AOpRes && res ){
170 _myTask->operator()(std::move(res));
177 template <
typename PrevRes,
typename Callback,
typename Enable =
void>
181 template <
typename PrevRes,
typename Callback>
183 :
public zyppng::AsyncOp< typename std::invoke_result_t<Callback, PrevRes> > {
186 static_assert( !is_async_op_v<value_type>,
"A AsyncResult can never return a async value" );
187 static_assert( !is_async_op_v<PrevRes>,
"A incoming value can never be a async value" );
189 template <
typename CBType = Callback>
191 : _prevTask(
std::move(prevTask) )
192 , _myTask(
std::forward<CBType>(cb) ) {
207 _prevTask->onReady( std::bind( &AsyncToSyncResult::readyWasCalled,
this, std::placeholders::_1) );
220 this->setReady(
std::invoke( _myTask, std::move( res )) );
228 template <
typename PrevRes,
typename Callback>
230 :
public zyppng::AsyncOp< typename remove_smart_ptr_t<std::invoke_result_t<Callback, PrevRes>>::value_type> {
233 static_assert(!is_async_op_v< value_type >,
"A AsyncResult can never return a async value" );
235 template <
typename CBType = Callback>
237 : _prevTask(
std::move(prevTask) )
238 , _myTask(
std::forward<CBType>(cb) ) {
253 _prevTask->onReady( std::bind( &AsyncToSyncResult::readyWasCalled,
this, std::placeholders::_1) );
267 _asyncResult =
std::invoke( _myTask, std::move(res) );
268 _asyncResult->onReady( [
this](
value_type &&val ) {
270 this->setReady( std::move(val) );
279 namespace operators {
281 template<
typename PrevOp ,
typename Callback,
286 using PrevOpRes =
typename PrevOp::value_type;
287 return std::make_shared<detail::AsyncToAsyncResult<PrevOpRes, Callback>>( std::move(in), std::move(c) );
290 template<
typename PrevOp ,
typename Callback,
294 auto operator| ( std::shared_ptr<PrevOp> &&in, Callback &&c )
296 using PrevOpRes =
typename PrevOp::value_type;
304 template<
typename PrevOp ,
typename Callback,
308 auto operator| ( std::shared_ptr<PrevOp> &&in, Callback &&c )
310 using PrevOpRes =
typename PrevOp::value_type;
319 template<
typename PrevRes ,
typename CallbackOp,
325 std::forward<CallbackOp>(c)->
operator()( std::forward<PrevRes>(in) );
331 template<
typename SyncRes
338 return std::forward<Callback>(c)(std::forward<SyncRes>(in));
auto operator|(std::shared_ptr< PrevOp > &&in, std::shared_ptr< Callback > &&c) -> AsyncOpRef< typename Callback::value_type >
typename make_void< Ts... >::type void_t
void readyWasCalled(PrevRes res)
void readyWasCalled(PrevRes res)
typename remove_reference< T >::type remove_reference_t
AsyncToSyncResult(AsyncOpRef< PrevRes > &&prevTask, CBType &&cb)
AsyncOpRef< value_type > _asyncResult
void setReady(value_type &&val)
void readyWasCalled(PrevRes res)
std::enable_if< std::is_member_pointer< typename std::decay< Functor >::type >::value, typename std::result_of< Functor &&(Args &&...)>::type >::type invoke(Functor &&f, Args &&... args)
constexpr bool is_nested_async_v
typename enable_if< B, T >::type enable_if_t
AsyncOpRef< PrevRes > _prevTask
AsyncToAsyncResult & operator=(const AsyncToAsyncResult &other)=delete
virtual ~AsyncToSyncResult()
constexpr bool is_future_monad_cb_v
virtual ~AsyncToAsyncResult()
AsyncOpRef< PrevRes > _prevTask
AsyncOpRef< PrevRes > _prevTask
std::conditional_t< isAsync, AsyncOpRef< T >, T > makeReadyResult(T &&result)
std::shared_ptr< AsyncOp< T > > AsyncOpRef
virtual ~AsyncToSyncResult()
AsyncToSyncResult(AsyncOpRef< PrevRes > &&prevTask, CBType &&cb)
constexpr bool is_sync_monad_cb_with_async_res_v
std::invoke_result_t< Callback, PrevRes > value_type
std::shared_ptr< CallbackOp > _myTask
typename remove_smart_ptr_t< std::invoke_result_t< Callback, PrevRes > >::value_type value_type
constexpr bool is_sync_monad_cb_v
typename remove_smart_ptr< T >::type remove_smart_ptr_t
AsyncToAsyncResult(AsyncOpRef< PrevRes > &&prevTask, std::shared_ptr< CallbackOp > &&cb)
constexpr bool is_sync_monad_cb_with_sync_res_v