[exec.factories] # 33 Execution control library [[exec]](./#exec) ## 33.9 Senders [[exec.snd]](exec.snd#exec.factories) ### 33.9.11 Sender factories [exec.factories] #### [33.9.11.1](#exec.schedule) execution​::​schedule [[exec.schedule]](exec.schedule) [1](#exec.schedule-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2877) schedule obtains a schedule sender ([[exec.async.ops]](exec.async.ops "33.3 Asynchronous operations")) from a scheduler[.](#exec.schedule-1.sentence-1) [2](#exec.schedule-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2881) The name schedule denotes a customization point object[.](#exec.schedule-2.sentence-1) For a subexpression sch, the expression schedule(sch) is expression-equivalent tosch.schedule()[.](#exec.schedule-2.sentence-2) [3](#exec.schedule-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2887) *Mandates*: The type of sch.schedule() satisfies [sender](exec.snd.concepts#concept:sender "33.9.3 Sender concepts [exec.snd.concepts]")[.](#exec.schedule-3.sentence-1) [4](#exec.schedule-4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2891) If the expressionget_completion_scheduler(get_env(sch.schedule())) == sch is ill-formed or evaluates to false, the behavior of calling schedule(sch) is undefined[.](#exec.schedule-4.sentence-1) #### [33.9.11.2](#exec.just) execution​::​just, execution​::​just_error, execution​::​just_stopped [[exec.just]](exec.just) [1](#exec.just-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2901) just, just_error, and just_stopped are sender factories whose asynchronous operations complete synchronously in their start operation with a value completion operation, an error completion operation, or a stopped completion operation, respectively[.](#exec.just-1.sentence-1) [2](#exec.just-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2908) The names just, just_error, and just_stopped denote customization point objects[.](#exec.just-2.sentence-1) Let *just-cpo* be one ofjust, just_error, or just_stopped[.](#exec.just-2.sentence-2) For a pack of subexpressions ts, let Ts be the pack of types decltype((ts))[.](#exec.just-2.sentence-3) The expression *just-cpo*(ts...) is ill-formed if - [(2.1)](#exec.just-2.1) ([*movable-value*](exec.general#concept:movable-value "33.1 General [exec.general]") &&...) is false, or - [(2.2)](#exec.just-2.2) *just-cpo* is just_error andsizeof...(ts) == 1 is false, or - [(2.3)](#exec.just-2.3) *just-cpo* is just_stopped andsizeof...(ts) == 0 is false[.](#exec.just-2.sentence-4) Otherwise, it is expression-equivalent to*make-sender*(*just-cpo*, *product-type*{ts...})[.](#exec.just-2.sentence-5) For just, just_error, and just_stopped, let *set-cpo* beset_value, set_error, and set_stopped, respectively[.](#exec.just-2.sentence-6) The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities")) is specialized for *just-cpo* as follows:namespace std::execution {template<>struct *impls-for*<*decayed-typeof*<*just-cpo*>> : *default-impls* {static constexpr auto *start* =[](auto& state, auto& rcvr) noexcept -> void {auto& [...ts] = state; *set-cpo*(std::move(rcvr), std::move(ts)...); }; };} #### [33.9.11.3](#exec.read.env) execution​::​read_env [[exec.read.env]](exec.read.env) [1](#exec.read.env-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2950) read_env is a sender factory for a sender whose asynchronous operation completes synchronously in its start operation with a value completion result equal to a value read from the receiver's associated environment[.](#exec.read.env-1.sentence-1) [2](#exec.read.env-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2956) read_env is a customization point object[.](#exec.read.env-2.sentence-1) For some query object q, the expression read_env(q) is expression-equivalent to*make-sender*(read_env, q)[.](#exec.read.env-2.sentence-2) [3](#exec.read.env-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2962) The exposition-only class template *impls-for* ([[exec.snd.expos]](exec.snd.expos "33.9.2 Exposition-only entities")) is specialized for read_env as follows: [🔗](#lib:impls-for%3cdecayed-typeof%3cread_env%3e%3e) namespace std::execution {template<>struct *impls-for*<*decayed-typeof*> : *default-impls* {static constexpr auto start =[](auto query, auto& rcvr) noexcept -> void {*TRY-SET-VALUE*(rcvr, query(get_env(rcvr))); }; }; templatestatic consteval void *check-types*();} [🔗](#lib:check-types,impls-for%3cdecayed-typeof%3cread_env%3e%3e) `template static consteval void check-types(); ` [4](#exec.read.env-4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2988) Let Q be decay_t<*data-type*>[.](#exec.read.env-4.sentence-1) [5](#exec.read.env-5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L2991) *Throws*: An exception of an unspecified type derived from exception if the expression Q()(env) is ill-formed or has type void, whereenv is an lvalue subexpression whose type is Env[.](#exec.read.env-5.sentence-1)