Iros
 
Loading...
Searching...
No Matches
use_resources.h
Go to the documentation of this file.
1#pragma once
2
11#include "di/meta/util.h"
12#include "di/util/move.h"
13
14namespace di::execution {
16 struct Function {
17 template<concepts::MovableValue Fun, concepts::MovableValue... Deferred>
19 auto operator()(Fun&& function, Deferred&&... deferred) const {
20 if constexpr (concepts::TagInvocable<Function, Fun, Deferred...>) {
21 static_assert(concepts::Sender<meta::TagInvokeResult<Function, Fun, Deferred...>>,
22 "use_resources() customizations must return a Sender.");
23 return function::tag_invoke(*this, util::forward<Fun>(function), util::forward<Deferred>(deferred)...);
24 } else {
26 [function = util::forward<Fun>(function)](auto&... resources) {
27 return first_value(zip(run(resources)...) | let_value_each(util::move(function)));
28 },
29 util::forward<Deferred>(deferred)...);
30 }
31 }
32 };
33}
34
56constexpr inline auto use_resources = use_resources_ns::Function {};
57}
Checks that a type model AsyncResource.
Definition run.h:50
Definition util.h:71
Definition sender.h:11
Definition tag_invoke.h:33
Definition use_resources.h:15
Definition bulk.h:30
constexpr auto let_value_with
Inject values into an operation state.
Definition let_value_with.h:118
constexpr auto run
Obtain access to an async resource.
Definition run.h:40
constexpr auto first_value
Transform a sequence into a sender of its first value.
Definition first_value.h:337
constexpr auto use_resources
Use async resources.
Definition use_resources.h:56
constexpr auto let_value_each
Transform the values of a sequence into new senders.
Definition let_each.h:59
constexpr auto zip
Zip multiple sequences together.
Definition zip.h:583
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition as_bool.h:8
decltype(di::function::tag_invoke(util::declval< Tag >(), util::declval< Args >()...)) TagInvokeResult
Definition tag_invoke.h:40
Definition use_resources.h:16