78 lines
3.2 KiB
Markdown
78 lines
3.2 KiB
Markdown
[exec.write.env]
|
||
|
||
# 33 Execution control library [[exec]](./#exec)
|
||
|
||
## 33.9 Senders [[exec.snd]](exec.snd#exec.write.env)
|
||
|
||
### 33.9.12 Sender adaptors [[exec.adapt]](exec.adapt#exec.write.env)
|
||
|
||
#### 33.9.12.3 execution::write_env [exec.write.env]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3143)
|
||
|
||
write_env is a sender adaptor
|
||
that accepts a sender and a queryable object, and
|
||
that returns a sender that,
|
||
when connected with a receiver rcvr,
|
||
connects the adapted sender with a receiver
|
||
whose execution environment is the result of
|
||
joining the [*queryable*](exec.queryable.concept#concept:queryable "33.2.2 queryable concept [exec.queryable.concept]") object
|
||
to the result of get_env(rcvr)[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3153)
|
||
|
||
write_env is a customization point object[.](#2.sentence-1)
|
||
|
||
For some subexpressions sndr and env,
|
||
if decltype((sndr)) does not satisfy [sender](exec.snd.concepts#concept:sender "33.9.3 Sender concepts [exec.snd.concepts]") or
|
||
if decltype((env)) does not satisfy [*queryable*](exec.queryable.concept#concept:queryable "33.2.2 queryable concept [exec.queryable.concept]"),
|
||
the expression write_env(sndr, env) is ill-formed[.](#2.sentence-2)
|
||
|
||
Otherwise, it is expression-equivalent to*make-sender*(write_env, env, sndr)[.](#2.sentence-3)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3162)
|
||
|
||
Let *write-env-t* denote the type decltype(auto(write_env))[.](#3.sentence-1)
|
||
|
||
The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities"))
|
||
is specialized for *write-env-t* as follows:
|
||
|
||
[ð](#lib:impls-for%3cwrite-env-t%3e)
|
||
|
||
template<>struct *impls-for*<*write-env-t*> : *default-impls* {static constexpr auto *join-env*(const auto& state, const auto& env) noexcept {return *see below*; }static constexpr auto *get-env* =[](auto, const auto& state, const auto& rcvr) noexcept {return *join-env*(state, *FWD-ENV*(get_env(rcvr))); }; template<class Sndr, class... Env>static consteval void *check-types*();};
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3184)
|
||
|
||
Invocation of*impls-for*<*write-env-t*>::*join-env* returns an object e such that
|
||
|
||
- [(4.1)](#4.1)
|
||
|
||
decltype(e) models [*queryable*](exec.queryable.concept#concept:queryable "33.2.2 queryable concept [exec.queryable.concept]") and
|
||
|
||
- [(4.2)](#4.2)
|
||
|
||
given a query object q,
|
||
the expression e.query(q) is expression-equivalent
|
||
to state.query(q) if that expression is valid,
|
||
otherwise, e.query(q) is expression-equivalent
|
||
to env.query(q)[.](#4.sentence-1)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L3199)
|
||
|
||
For a type Sndr and a pack of types Env,
|
||
let State be *data-type*<Sndr> and
|
||
let JoinEnv be the packdecltype(*join-env*(declval<State>(), *FWD-ENV*(declval<Env>())))[.](#5.sentence-1)
|
||
|
||
Then *impls-for*<*write-env-t*>::*check-types*<Sndr, Env...>() is expression-equivalent toget_completion_signatures<*child-
|
||
type*<Sndr>, JoinEnv...>()[.](#5.sentence-2)
|