task move_to()

in Source/Shared/arcana/scheduling/state_machine.h [26:49]


        task<T, std::error_code> move_to(state_machine_state<T>& state, cancellation& cancel)
        {
            completions stateTasks{};

            {
                std::lock_guard<std::mutex> guard{ m_mutex };
                stateTasks = fetch_state(state);
            }

            stateTasks.StateEntered->complete(expected<void, std::error_code>::make_valid());

            std::shared_ptr<cancellation_data> listener = std::make_shared<cancellation_data>(cancel.add_listener([this, &state]
            {
                cancel_exit(state);
            }));

            return stateTasks.StateExited.unsafe_cast<T, std::error_code>().as_task()
                .then(inline_scheduler, cancellation::none(),
                    [listener = std::move(listener)](const arcana::expected<T, std::error_code>& result) mutable noexcept
                    {
                        listener.reset();
                        return result;
                    });
        }