diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7a2c991c..117f209e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -65,6 +65,6 @@ repos: rev: v0.5.2 hooks: - id: beman-tidy - args: [".", "--verbose"] + args: [".", "--verbose", "--require-all"] exclude: 'infra/' diff --git a/README.md b/README.md index 4555f96f..6ff6f784 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ +# beman.execution: Building Block For Asynchronous Programs -# beman.execution: Building Block For Asynchronous Programs -[![Library Status](https://raw.githubusercontent.com/bemanproject/beman/refs/heads/main/images/badges/beman_badge-beman_library_under_development.svg)](https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#the-beman-library-maturity-model) -![Standard Target](https://github.com/bemanproject/beman/blob/main/images/badges/cpp26.svg) [![Coverage](https://coveralls.io/repos/github/bemanproject/execution/badge.svg?branch=main)](https://coveralls.io/github/bemanproject/execution?branch=main) +[![Library Status](https://raw.githubusercontent.com/bemanproject/beman/refs/heads/main/images/badges/beman_badge-beman_library_under_development.svg)](https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#the-beman-library-maturity-model)![Standard Target](https://github.com/bemanproject/beman/blob/main/images/badges/cpp26.svg)[![Coverage](https://coveralls.io/repos/github/bemanproject/execution/badge.svg?branch=main)](https://coveralls.io/github/bemanproject/execution?branch=main)[![Compiler Explorer Example](https://img.shields.io/badge/Try%20it%20on%20Compiler%20Explorer-grey?logo=compilerexplorer&logoColor=67c52a)](https://godbolt.org/z/9nfa3rTTK) -`beman.execution` provides the basic vocabulary for asynchronous -programming as well as important algorithms implemented in terms -of this vocabulary. The key entities of the vocabulary are: + +`beman.execution` provides the basic vocabulary for asynchronous programming as well as important algorithms implemented in terms of this vocabulary. + +**Implements**: [`std::execution` (P2300R10)](http://wg21.link/P2300R10). + +The key entities of the vocabulary are: - `scheduler` used to control where operations are executed. - The key operation is `schedule(scheduler) -> sender`. @@ -38,8 +40,6 @@ e.g.: completed. - `bulk(...)` to executed execute work, potentially concurrently. -**Implements:** [`std::execution` (P2300R10)](http://wg21.link/P2300R10). - **Status**: [Under development and not yet ready for production use.](https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#under-development-and-not-yet-ready-for-production-use) ## Help Welcome! diff --git a/docs/code/tst.hpp b/docs/code/tst.hpp index d7541087..024d3b7b 100644 --- a/docs/code/tst.hpp +++ b/docs/code/tst.hpp @@ -4,9 +4,9 @@ #ifndef INCLUDED_EXAMPLES_TST #define INCLUDED_EXAMPLES_TST -#include "tst-config.hpp" -#include "tst-repeat_effect_until.hpp" -#include "tst-sync_wait.hpp" -#include "tst-timer.hpp" +#include "tst_config.hpp" +#include "tst_repeat_effect_until.hpp" +#include "tst_sync_wait.hpp" +#include "tst_timer.hpp" #endif diff --git a/docs/code/tst-basic-timer.cpp b/docs/code/tst_basic_timer.cpp similarity index 94% rename from docs/code/tst-basic-timer.cpp rename to docs/code/tst_basic_timer.cpp index 7244945b..bf42915a 100644 --- a/docs/code/tst-basic-timer.cpp +++ b/docs/code/tst_basic_timer.cpp @@ -1,8 +1,8 @@ -// examples/tst-basic-timer.cpp -*-C++-*- +// examples/tst_basic_timer.cpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // ---------------------------------------------------------------------------- -#include +#include #include #include "tst.hpp" namespace ex = beman::execution; diff --git a/docs/code/tst-config.hpp b/docs/code/tst_config.hpp similarity index 78% rename from docs/code/tst-config.hpp rename to docs/code/tst_config.hpp index c25fde48..832a30a0 100644 --- a/docs/code/tst-config.hpp +++ b/docs/code/tst_config.hpp @@ -1,4 +1,4 @@ -// docs/code/tst-config.hpp -*-C++-*- +// docs/code/tst_config.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #ifndef INCLUDED_DOCS_CODE_TST_CONFIG @@ -6,7 +6,7 @@ // ---------------------------------------------------------------------------- -#include +#include namespace tst { namespace ex = beman::execution; } diff --git a/docs/code/tst-repeat_effect_until.hpp b/docs/code/tst_repeat_effect_until.hpp similarity index 97% rename from docs/code/tst-repeat_effect_until.hpp rename to docs/code/tst_repeat_effect_until.hpp index 950584d4..e25c9b58 100644 --- a/docs/code/tst-repeat_effect_until.hpp +++ b/docs/code/tst_repeat_effect_until.hpp @@ -1,4 +1,4 @@ -// examples/tst-repeat_effect_until.hpp -*-C++-*- +// examples/tst_repeat_effect_until.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // ---------------------------------------------------------------------------- @@ -8,7 +8,7 @@ #include #include #include -#include "tst-config.hpp" +#include "tst_config.hpp" // ---------------------------------------------------------------------------- diff --git a/docs/code/tst-sync_wait.hpp b/docs/code/tst_sync_wait.hpp similarity index 96% rename from docs/code/tst-sync_wait.hpp rename to docs/code/tst_sync_wait.hpp index 341a4fef..41e33d05 100644 --- a/docs/code/tst-sync_wait.hpp +++ b/docs/code/tst_sync_wait.hpp @@ -1,4 +1,4 @@ -// docs/code/tst-sync_wait.hpp -*-C++-*- +// docs/code/tst_sync_wait.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // ---------------------------------------------------------------------------- @@ -7,7 +7,7 @@ #include #include -#include "tst-config.hpp" +#include "tst_config.hpp" // ---------------------------------------------------------------------------- diff --git a/docs/code/tst-timer.hpp b/docs/code/tst_timer.hpp similarity index 98% rename from docs/code/tst-timer.hpp rename to docs/code/tst_timer.hpp index 032388be..bb86aa9c 100644 --- a/docs/code/tst-timer.hpp +++ b/docs/code/tst_timer.hpp @@ -1,4 +1,4 @@ -// docs/code/tst-timer.hpp -*-C++-*- +// docs/code/tst_timer.hpp -*-C++-*- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #ifndef INCLUDED_DOCS_CODE_TST_TIMER @@ -9,7 +9,7 @@ #include #include #include -#include "tst-config.hpp" +#include "tst_config.hpp" // ---------------------------------------------------------------------------- diff --git a/docs/intro-examples.md b/docs/intro_examples.md similarity index 95% rename from docs/intro-examples.md rename to docs/intro_examples.md index 0ab96501..b1f05fb8 100644 --- a/docs/intro-examples.md +++ b/docs/intro_examples.md @@ -8,8 +8,8 @@ This page provides a series of examples showing how to use the
`"Hello, world"` - synchronous using asynchronous components -Code: [`examples/intro-1-hello-world.cpp`]() -@include examples/intro-1-hello-world.cpp +Code: [`examples/intro_1_hello_world.cpp`]() +@include examples/intro_1_hello_world.cpp The first example is a very complicated way to a version of `"Hello, world"`: it uses components for dealing with asynchronous work to @@ -20,10 +20,10 @@ work. The components for `std::execution` are declared in the header ``. This particular implementation implements the cmponents in namespace `beman::execution` declared in the header -``: +``: ```cpp -#include +#include #include #include #include @@ -126,7 +126,7 @@ The components used in this example do all of that synchronously:
`"Hello, async"` - a simple asynchronous example -Code: [`examples/intro-2-hello-async.cpp`]() -@include examples/intro-2-hello-async.cpp +Code: [`examples/intro_2_hello_async.cpp`]() +@include examples/intro_2_hello_async.cpp
diff --git a/docs/modules.md b/docs/modules.md index 91736936..4e8e6e78 100644 --- a/docs/modules.md +++ b/docs/modules.md @@ -42,7 +42,7 @@ like this: ```c++ module; -#include +#include export module beman.execution; @@ -181,7 +181,7 @@ though (more [rumination on tests](#modules-vs-testing) below): dependent on. Since the corresponding header were actually included by a component header things still worked. So, the corresponding headers needed to be added. -- Instead of `#include ` the tests +- Instead of `#include ` the tests now use `import beman.execution;` (well, the test really use conditional compilation to either use a header or an `import` statement). Including any standard library header _after_ the diff --git a/docs/tutorial.mds b/docs/tutorial.mds index 12849dad..871eda4d 100644 --- a/docs/tutorial.mds +++ b/docs/tutorial.mds @@ -17,7 +17,7 @@ are tested using assume the library is made available using code like this together with namespace alias `ex` for the namespace for `beman::execution`:
- `#include ` + `#include `

There are or will be multiple implementations of [`std::execution`](https://wg21.link/exec) and the examples @@ -30,7 +30,7 @@ with namespace alias `ex` for the namespace for `beman::execution`: the example were tested with this implementation. The examples would start with

-         #include 
+         #include 
          namespace ex = beman::execution;
        
@@ -64,7 +64,7 @@ collections of components mode available by a header: [`std::execution`](https://wg21.link/exec). By default the names from [`beman::execution`](https://github.com/bemanproject/execution) are used. The used names are set up via - [`docs/code/tst-config.hpp`](https://github.com/bemanproject/execution/files/docs/code/tst-config.hpp). + [`docs/code/tst_config.hpp`](https://github.com/bemanproject/execution/files/docs/code/tst_config.hpp). When trying to use the examples with a different implementation it should be sufficient to adjust this header accordingly.
@@ -103,7 +103,7 @@ with the kinds of results an asynchronous function can produce:
`auto[b, i] = *ex::sync_wait(ex::just(true, 1));`
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -129,7 +129,7 @@ with the kinds of results an asynchronous function can produce:
       how it can succeed. How to do that will be shown later in the
       tutorial.
       
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -155,7 +155,7 @@ with the kinds of results an asynchronous function can produce:
       _sndr_ doesn't already declare how it can succeed.
       How to do that will be shown later in the tutorial  .
       
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -219,7 +219,7 @@ pipe notation.
                    `ex::just(true, 17) | ex::then([](bool, int i){ return 2 * i; })`
                    Transform the results by doubling the second element and returning it.
                    
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -236,7 +236,7 @@ pipe notation.
                    If the transformation fails with an exception, an error with the caught
                    exception is produced.
                    
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -254,7 +254,7 @@ pipe notation.
                   transformed by the function passed to `ex::then`. Instead, the error is passed
                   through.
                   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -278,7 +278,7 @@ pipe notation.
 		  function passed to `ex::then`. Instead, the stopped
 		  completion is passed through.
                   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -302,7 +302,7 @@ pipe notation.
                 
`ex:::just_error(17) | ex::upon_error([](int e){ return e; })`
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -318,7 +318,7 @@ pipe notation.
                    Using both `then` and `upon_error` the result of an
                    operation can be turned into an `std::expected`:
                    
-  #include 
+  #include 
   #include 
   #include 
   namespace ex = beman::execution;
@@ -345,7 +345,7 @@ pipe notation.
                 
`ex:::just_stopped() | ex::upon_stopped([](){ return 42; })`
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -393,7 +393,7 @@ pipe notation.
                   a value is returned synchronously but in general the
                   sender can be any asynchronous operation.
                   
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -415,7 +415,7 @@ pipe notation.
                   throwing an exception; in this case the result is used with
                   `sync_wait` which will still throw an exception).
                   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -439,7 +439,7 @@ pipe notation.
                   complete the transformed kind of results (`tst::just_error` is like
                   `ex::just_error` but also pretends to complete successful).
                   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -462,7 +462,7 @@ pipe notation.
                   the function object still needs to return a sender to satisfy the requirement
                   of `let_value`'s interface.
                   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -489,7 +489,7 @@ pipe notation.
                 
`ex::just_error(17) | ex::let_error([](int e) { return ex::just(e); })`
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -512,7 +512,7 @@ pipe notation.
                 
`ex::just_stopped() | ex::let_stopped([](int e) { return ex::just(7); })`
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -556,7 +556,7 @@ pipe notation.
                   The result of `ex::when_all(ex::just(true), ex::just(), ex::just(17, 2.5))` is
                   a `std::tuple(true, 17, 2.5)`.
   
-  #include 
+  #include 
   #include 
   namespace ex = beman::execution;
 
@@ -577,7 +577,7 @@ pipe notation.
                   `tst::when_all` adapts each sender to pretend that they can complete
                   successfully if it doesn't already.
   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
@@ -601,7 +601,7 @@ pipe notation.
                   `tst::when_all` adapts each sender to pretend that they can complete
                   successfully if it doesn't already.
   
-  #include 
+  #include 
   #include 
   #include "tst.hpp"
   namespace ex = beman::execution;
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index aba158af..effe9928 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -22,23 +22,23 @@ set(TODO suspend_never) #-dk:TODO including that causes ASAN errors
 
 set(EXAMPLES
     allocator
-    doc-just
-    doc-just_error
-    doc-just_stopped
+    doc_just
+    doc_just_error
+    doc_just_stopped
     inspect
-    intro-1-hello-world
-    intro-2-hello-async
-    intro-5-consumer
+    intro_1_hello_world
+    intro_2_hello_async
+    intro_5_consumer
     playground
-    sender-demo
+    sender_demo
     stackoverflow
     stopping
-    when_all-cancel
+    when_all_cancel
 )
 
 if(BEMAN_USE_MODULES)
-    #-dk:TODO gcc doesn't like the modules: list(APPEND EXAMPLES modules modules-and-header)
-    list(APPEND EXAMPLES modules-and-header)
+    #-dk:TODO gcc doesn't like the modules: list(APPEND EXAMPLES modules modules_and_header)
+    list(APPEND EXAMPLES modules_and_header)
 endif()
 
 foreach(EXAMPLE ${EXAMPLES})
diff --git a/examples/allocator.cpp b/examples/allocator.cpp
index 3c00ed07..b14ed5f0 100644
--- a/examples/allocator.cpp
+++ b/examples/allocator.cpp
@@ -10,7 +10,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = beman::execution;
diff --git a/examples/doc-just.cpp b/examples/doc_just.cpp
similarity index 79%
rename from examples/doc-just.cpp
rename to examples/doc_just.cpp
index d25ded01..4979b153 100644
--- a/examples/doc-just.cpp
+++ b/examples/doc_just.cpp
@@ -1,4 +1,4 @@
-// examples/doc-just.cpp                                              -*-C++-*-
+// examples/doc_just.cpp                                              -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -6,7 +6,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 namespace ex = beman::execution;
 using namespace std::string_literals;
diff --git a/examples/doc-just_error.cpp b/examples/doc_just_error.cpp
similarity index 87%
rename from examples/doc-just_error.cpp
rename to examples/doc_just_error.cpp
index 7acba327..48a9f98f 100644
--- a/examples/doc-just_error.cpp
+++ b/examples/doc_just_error.cpp
@@ -1,4 +1,4 @@
-// examples/doc-just_error.cpp                                        -*-C++-*-
+// examples/doc_just_error.cpp                                        -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -6,7 +6,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 namespace ex = beman::execution;
 
diff --git a/examples/doc-just_stopped.cpp b/examples/doc_just_stopped.cpp
similarity index 81%
rename from examples/doc-just_stopped.cpp
rename to examples/doc_just_stopped.cpp
index b4fe76f0..12971e32 100644
--- a/examples/doc-just_stopped.cpp
+++ b/examples/doc_just_stopped.cpp
@@ -1,4 +1,4 @@
-// examples/doc-just_stopped.cpp                                      -*-C++-*-
+// examples/doc_just_stopped.cpp                                      -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -6,7 +6,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 namespace ex = beman::execution;
 
diff --git a/examples/inspect.cpp b/examples/inspect.cpp
index 924a61a4..92d6ade2 100644
--- a/examples/inspect.cpp
+++ b/examples/inspect.cpp
@@ -11,7 +11,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = beman::execution;
diff --git a/examples/intro-1-hello-world.cpp b/examples/intro_1_hello_world.cpp
similarity index 81%
rename from examples/intro-1-hello-world.cpp
rename to examples/intro_1_hello_world.cpp
index 92fb6bc7..aacdd25d 100644
--- a/examples/intro-1-hello-world.cpp
+++ b/examples/intro_1_hello_world.cpp
@@ -1,4 +1,4 @@
-// examples/intro-1-hello-world.cpp                                   -*-C++-*-
+// examples/intro_1_hello_world.cpp                                   -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -9,14 +9,14 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = ::beman::execution;
 using namespace std::string_literals;
 
 // ----------------------------------------------------------------------------
-// Please see the explanation in docs/intro-examples.md for an explanation.
+// Please see the explanation in docs/intro_examples.md for an explanation.
 
 int main() {
     // clang-format off
diff --git a/examples/intro-2-hello-async.cpp b/examples/intro_2_hello_async.cpp
similarity index 86%
rename from examples/intro-2-hello-async.cpp
rename to examples/intro_2_hello_async.cpp
index 58483a0d..e61a4384 100644
--- a/examples/intro-2-hello-async.cpp
+++ b/examples/intro_2_hello_async.cpp
@@ -1,4 +1,4 @@
-// examples/intro-2-hello-async.cpp                                   -*-C++-*-
+// examples/intro_2_hello_async.cpp                                   -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -10,16 +10,16 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
-#include "intro-timer.hpp"
+#include "intro_timer.hpp"
 
 namespace ex = ::beman::execution;
 using namespace std::string_literals;
 using namespace std::chrono_literals;
 
 // ----------------------------------------------------------------------------
-// Please see the explanation in docs/intro-examples.md for an explanation.
+// Please see the explanation in docs/intro_examples.md for an explanation.
 
 int main() {
     std::cout << std::unitbuf;
diff --git a/examples/intro-5-consumer.cpp b/examples/intro_5_consumer.cpp
similarity index 98%
rename from examples/intro-5-consumer.cpp
rename to examples/intro_5_consumer.cpp
index c85802e4..4cabd6eb 100644
--- a/examples/intro-5-consumer.cpp
+++ b/examples/intro_5_consumer.cpp
@@ -1,4 +1,4 @@
-// examples/intro-5-consumer.cpp                                      -*-C++-*-
+// examples/intro_5_consumer.cpp                                      -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -13,7 +13,7 @@
 import beman.execution;
 import beman.execution.detail;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = ::beman::execution;
diff --git a/examples/intro-timer.hpp b/examples/intro_timer.hpp
similarity index 98%
rename from examples/intro-timer.hpp
rename to examples/intro_timer.hpp
index acc79871..25ec0e01 100644
--- a/examples/intro-timer.hpp
+++ b/examples/intro_timer.hpp
@@ -1,4 +1,4 @@
-// examples/intro-timer.hpp                                           -*-C++-*-
+// examples/intro_timer.hpp                                           -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #ifndef INCLUDED_EXAMPLES_INTRO_TIMER
diff --git a/examples/just_stopped.cpp b/examples/just_stopped.cpp
index ec15cf8c..8a6640fc 100644
--- a/examples/just_stopped.cpp
+++ b/examples/just_stopped.cpp
@@ -4,7 +4,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 namespace ex = beman::execution;
 
diff --git a/examples/modules-and-header.cpp b/examples/modules_and_header.cpp
similarity index 77%
rename from examples/modules-and-header.cpp
rename to examples/modules_and_header.cpp
index b531140c..f7ba4c5b 100644
--- a/examples/modules-and-header.cpp
+++ b/examples/modules_and_header.cpp
@@ -1,4 +1,4 @@
-// examples/modules-and-header.cpp                                    -*-C++-*-
+// examples/modules_and_header.cpp                                    -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
diff --git a/examples/playground.cpp b/examples/playground.cpp
index f62cdea9..2412f1b6 100644
--- a/examples/playground.cpp
+++ b/examples/playground.cpp
@@ -8,7 +8,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = ::beman::execution;
diff --git a/examples/sender-demo.cpp b/examples/sender_demo.cpp
similarity index 96%
rename from examples/sender-demo.cpp
rename to examples/sender_demo.cpp
index c7522737..a9a4e63f 100644
--- a/examples/sender-demo.cpp
+++ b/examples/sender_demo.cpp
@@ -1,4 +1,4 @@
-// examples/sender-demo.cpp                                           -*-C++-*-
+// examples/sender_demo.cpp                                           -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -11,7 +11,7 @@
 import beman.execution;
 import beman.execution.detail;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = beman::execution;
diff --git a/examples/stackoverflow.cpp b/examples/stackoverflow.cpp
index 71122d7b..5d25f1ac 100644
--- a/examples/stackoverflow.cpp
+++ b/examples/stackoverflow.cpp
@@ -9,7 +9,7 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
+#include 
 #endif
 
 namespace ex = beman::execution;
diff --git a/examples/stop_token.cpp b/examples/stop_token.cpp
index eb546678..c967e377 100644
--- a/examples/stop_token.cpp
+++ b/examples/stop_token.cpp
@@ -10,8 +10,8 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
-#include 
+#include 
+#include 
 #endif
 
 namespace exec = beman::execution;
diff --git a/examples/stopping.cpp b/examples/stopping.cpp
index 4fdfa1dd..124b7856 100644
--- a/examples/stopping.cpp
+++ b/examples/stopping.cpp
@@ -13,8 +13,8 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
-#include 
+#include 
+#include 
 #endif
 
 using namespace std::chrono;
diff --git a/examples/suspend_never.cpp b/examples/suspend_never.cpp
index 059f05bb..f72c8ebe 100644
--- a/examples/suspend_never.cpp
+++ b/examples/suspend_never.cpp
@@ -7,7 +7,7 @@ import std;
 #include 
 #include 
 #endif
-#include 
+#include 
 
 namespace ex = beman::execution;
 
diff --git a/examples/when_all-cancel.cpp b/examples/when_all_cancel.cpp
similarity index 97%
rename from examples/when_all-cancel.cpp
rename to examples/when_all_cancel.cpp
index 17d51f06..6c8d58e6 100644
--- a/examples/when_all-cancel.cpp
+++ b/examples/when_all_cancel.cpp
@@ -1,4 +1,4 @@
-// examples/when_all-cancel.cpp                                       -*-C++-*-
+// examples/when_all_cancel.cpp                                       -*-C++-*-
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
 #include 
@@ -13,8 +13,8 @@
 #ifdef BEMAN_HAS_MODULES
 import beman.execution;
 #else
-#include 
-#include 
+#include 
+#include 
 #endif
 
 namespace ex = beman::execution;
diff --git a/include/beman/execution.hpp b/include/beman/execution.hpp
new file mode 100644
index 00000000..e2333978
--- /dev/null
+++ b/include/beman/execution.hpp
@@ -0,0 +1,9 @@
+// include/beman/execution.hpp                                        -*-C++-*-
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+#ifndef INCLUDED_BEMAN_EXECUTION
+#define INCLUDED_BEMAN_EXECUTION
+
+#include 
+
+#endif
diff --git a/include/beman/execution/detail/allocator_aware_move.hpp b/include/beman/execution/detail/allocator_aware_move.hpp
index de12ef6f..3d54585b 100644
--- a/include/beman/execution/detail/allocator_aware_move.hpp
+++ b/include/beman/execution/detail/allocator_aware_move.hpp
@@ -28,7 +28,7 @@ namespace beman::execution::detail {
 template 
 /*!
  * \brief Utility function use to move a possibly allocator aware object with an allocator from an environment.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 auto allocator_aware_move(T&& obj, Context&& context) noexcept -> decltype(auto) {
diff --git a/include/beman/execution/detail/almost_scheduler.hpp b/include/beman/execution/detail/almost_scheduler.hpp
index d8361473..a01d1aa4 100644
--- a/include/beman/execution/detail/almost_scheduler.hpp
+++ b/include/beman/execution/detail/almost_scheduler.hpp
@@ -28,7 +28,7 @@ import beman.execution.detail.sender;
 namespace beman::execution::detail {
 /*!
  * \brief Auxiliary concept used to break cycle for scheduler concept.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  * \concept almost_scheduler
  */
diff --git a/include/beman/execution/detail/apply_sender.hpp b/include/beman/execution/detail/apply_sender.hpp
index da671f29..f93f60c6 100644
--- a/include/beman/execution/detail/apply_sender.hpp
+++ b/include/beman/execution/detail/apply_sender.hpp
@@ -23,7 +23,7 @@ import beman.execution.detail.sender;
 namespace beman::execution {
 /*!
  * \brief Function used to transform a sender and its arguments for a domain.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  */
 template 
     requires requires(Domain domain, Tag tag, Sender&& sender, Args&&... args) {
@@ -36,7 +36,7 @@ constexpr auto apply_sender(Domain domain, Tag, Sender&& sender, Args&&... args)
 
 /*!
  * \brief Default function used to transform a second and its arguments.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  */
 template 
     requires(not requires(Domain domain, Tag tag, Sender&& sender, Args&&... args) {
diff --git a/include/beman/execution/detail/as_awaitable.hpp b/include/beman/execution/detail/as_awaitable.hpp
index c55571aa..803713aa 100644
--- a/include/beman/execution/detail/as_awaitable.hpp
+++ b/include/beman/execution/detail/as_awaitable.hpp
@@ -79,7 +79,7 @@ concept directly_awaitable = requires {
 namespace beman::execution {
 /*!
  * \brief Turn an entity, e.g., a sender, into an awaitable.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  */
 struct as_awaitable_t {
     template 
diff --git a/include/beman/execution/detail/as_except_ptr.hpp b/include/beman/execution/detail/as_except_ptr.hpp
index e54b3359..5f9ee471 100644
--- a/include/beman/execution/detail/as_except_ptr.hpp
+++ b/include/beman/execution/detail/as_except_ptr.hpp
@@ -21,7 +21,7 @@ import std;
 namespace beman::execution::detail {
 /*!
  * \brief Turn an error into a suitable exception_ptr.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
diff --git a/include/beman/execution/detail/await_result_type.hpp b/include/beman/execution/detail/await_result_type.hpp
index 6897a9e5..f434f6cb 100644
--- a/include/beman/execution/detail/await_result_type.hpp
+++ b/include/beman/execution/detail/await_result_type.hpp
@@ -21,7 +21,7 @@ import beman.execution.detail.get_awaiter;
 namespace beman::execution::detail {
 /*!
  * \brief Auxiliary type alias to get the result type of an awaiter.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template  //-dk:TODO detail export
diff --git a/include/beman/execution/detail/await_suspend_result.hpp b/include/beman/execution/detail/await_suspend_result.hpp
index 210c8ecc..fbc5a3be 100644
--- a/include/beman/execution/detail/await_suspend_result.hpp
+++ b/include/beman/execution/detail/await_suspend_result.hpp
@@ -18,14 +18,14 @@ import std;
 namespace beman::execution::detail {
 /*!
  * \brief Auxiliary type trait used to detect specializations of `std::coroutine_handle`.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
 struct is_coroutine_handle : ::std::false_type {};
 /*!
  * \brief The actual partial specialization detecting `std::coroutine_handle`.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
@@ -33,7 +33,7 @@ struct is_coroutine_handle<::std::coroutine_handle> : ::std::true_type {};
 
 /*!
  * \brief A concept used to identify valid results for `await_suspend`.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
diff --git a/include/beman/execution/detail/basic_operation.hpp b/include/beman/execution/detail/basic_operation.hpp
index 73a66f0c..aa18fd01 100644
--- a/include/beman/execution/detail/basic_operation.hpp
+++ b/include/beman/execution/detail/basic_operation.hpp
@@ -40,7 +40,7 @@ import beman.execution.detail.valid_specialization;
 namespace beman::execution::detail {
 /*!
  * \brief Class template use to factor out common operation state needs.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 //-dk:TODO the export below shouldn't be needed, but MSVC++ seems to require it (2026-02-01)
diff --git a/include/beman/execution/detail/basic_receiver.hpp b/include/beman/execution/detail/basic_receiver.hpp
index 5a30a1e0..8fb1c09f 100644
--- a/include/beman/execution/detail/basic_receiver.hpp
+++ b/include/beman/execution/detail/basic_receiver.hpp
@@ -45,7 +45,7 @@ import beman.execution.detail.valid_specialization;
 namespace beman::execution::detail {
 /*!
  * \brief Class template used as receiver for child completions for library senders.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
diff --git a/include/beman/execution/detail/basic_sender.hpp b/include/beman/execution/detail/basic_sender.hpp
index 2cfb610d..9fe8d449 100644
--- a/include/beman/execution/detail/basic_sender.hpp
+++ b/include/beman/execution/detail/basic_sender.hpp
@@ -60,7 +60,7 @@ inline constexpr sub_apply_t sub_apply{};
 
 /*!
  * \brief Class template used to factor out common sender implementation for library senders.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
diff --git a/include/beman/execution/detail/basic_state.hpp b/include/beman/execution/detail/basic_state.hpp
index 666af4e0..4ee65eb8 100644
--- a/include/beman/execution/detail/basic_state.hpp
+++ b/include/beman/execution/detail/basic_state.hpp
@@ -28,7 +28,7 @@ import beman.execution.detail.tag_of_t;
 namespace beman::execution::detail {
 /*!
  * \brief Class template used to present the receiver and operation state for library senders.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template 
diff --git a/include/beman/execution/detail/call_result_t.hpp b/include/beman/execution/detail/call_result_t.hpp
index 19aaa2a6..168510e7 100644
--- a/include/beman/execution/detail/call_result_t.hpp
+++ b/include/beman/execution/detail/call_result_t.hpp
@@ -17,7 +17,7 @@ namespace beman::execution::detail {
 template 
 /*!
  * \brief Type alias used determine the result of function [object] call.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 using call_result_t = decltype(::std::declval()(std::declval()...));
diff --git a/include/beman/execution/detail/callable.hpp b/include/beman/execution/detail/callable.hpp
index 3483fb02..1f43b9de 100644
--- a/include/beman/execution/detail/callable.hpp
+++ b/include/beman/execution/detail/callable.hpp
@@ -16,7 +16,7 @@ import std;
 namespace beman::execution::detail {
 /*!
  * \brief Concept used to detect callable objects.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \concept callable
  * \internal
  */
diff --git a/include/beman/execution/detail/check_type_alias_exist.hpp b/include/beman/execution/detail/check_type_alias_exist.hpp
index e609a8e8..ba0b717a 100644
--- a/include/beman/execution/detail/check_type_alias_exist.hpp
+++ b/include/beman/execution/detail/check_type_alias_exist.hpp
@@ -11,7 +11,7 @@
 namespace beman::execution::detail {
 /*!
  * \brief Auxiliary class template used to detect whether a type alias exist within a class.
- * \headerfile beman/execution/execution.hpp 
+ * \headerfile beman/execution.hpp 
  * \internal
  */
 template