[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))); }; templatestatic 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* and let JoinEnv be the packdecltype(*join-env*(declval(), *FWD-ENV*(declval())))[.](#5.sentence-1) Then *impls-for*<*write-env-​t*>​::​*check-types*() is expression-equivalent toget_completion_signatures<*child- type*, JoinEnv...>()[.](#5.sentence-2)