1515 */
1616#pragma once
1717
18+ #include " ../functional.hpp"
1819#include " __concepts.hpp"
1920#include " __config.hpp"
2021#include " __meta.hpp"
@@ -39,20 +40,20 @@ namespace STDEXEC
3940 __promise.await_transform (static_cast <_Awaitable &&>(__awaitable));
4041 };
4142
42- template <class _Awaitable >
43- constexpr auto __get_awaitable (_Awaitable &&__awaitable, __ignore = {}) -> decltype(auto )
44- {
45- return static_cast <_Awaitable &&>(__awaitable);
46- }
43+ inline constexpr auto __get_awaitable = __first_callable{
44+ []<class _Promise , __has_await_transform<_Promise> _Awaitable>(_Awaitable &&__awaitable,
45+ _Promise &__promise)
46+ -> decltype (auto )
47+ { return __promise.await_transform (static_cast <_Awaitable &&>(__awaitable)); },
48+ []<class _Awaitable >(_Awaitable &&__awaitable, __ignore = {}) -> decltype (auto )
49+ { return static_cast <_Awaitable &&>(__awaitable); }};
4750
48- template <class _Promise , __has_await_transform<_Promise> _Awaitable>
49- constexpr auto __get_awaitable (_Awaitable &&__awaitable, _Promise &__promise) -> decltype(auto )
50- {
51- return __promise.await_transform (static_cast <_Awaitable &&>(__awaitable));
52- }
51+ template <class _Awaitable , class _Promise >
52+ using __awaitable_of_t = decltype (STDEXEC::__get_awaitable(__declval<_Awaitable>(),
53+ __declval<_Promise &>()));
5354
54- template < class _Awaitable >
55- constexpr auto __get_awaiter (_Awaitable &&__awaitable) -> decltype(auto )
55+ inline constexpr auto __get_awaiter =
56+ []< class _Awaitable > (_Awaitable &&__awaitable) -> decltype (auto )
5657 {
5758 if constexpr (requires { __declval<_Awaitable>().operator co_await (); })
5859 {
@@ -66,7 +67,10 @@ namespace STDEXEC
6667 {
6768 return static_cast <_Awaitable &&>(__awaitable);
6869 }
69- }
70+ };
71+
72+ template <class _Awaitable >
73+ using __awaiter_of_t = decltype (STDEXEC::__get_awaiter(__declval<_Awaitable>()));
7074
7175 template <class _Awaitable , class ... _Promise>
7276 concept __awaitable = requires (_Awaitable &&__awaitable, _Promise &...__promise) {
0 commit comments