FastLED 3.9.15
Loading...
Searching...
No Matches
promise.h
Go to the documentation of this file.
1#pragma once
2
43
44#include "fl/namespace.h"
45#include "fl/function.h"
46#include "fl/string.h"
47#include "fl/shared_ptr.h"
48#include "fl/move.h"
49
50namespace fl {
51
53struct Error {
55
56 Error() = default;
57 Error(const fl::string& msg) : message(msg) {}
58 Error(const char* msg) : message(msg) {}
59 Error(fl::string&& msg) : message(fl::move(msg)) {}
60 bool is_empty() const { return message.empty(); }
61};
62
63// Forward declaration for implementation
64namespace detail {
65 template<typename T>
66 class PromiseImpl;
67}
68
71template<typename T>
72class promise {
73public:
75 static promise<T> create() {
77 return promise<T>(impl);
78 }
79
81 static promise<T> resolve(const T& value) {
82 auto p = create();
83 p.complete_with_value(value);
84 return p;
85 }
86
88 static promise<T> resolve(T&& value) {
89 auto p = create();
90 p.complete_with_value(fl::move(value));
91 return p;
92 }
93
95 static promise<T> reject(const Error& error) {
96 auto p = create();
97 p.complete_with_error(error);
98 return p;
99 }
100
102 static promise<T> reject(const fl::string& error_message) {
103 return reject(Error(error_message));
104 }
105
107 promise() : mImpl(nullptr) {}
108
110 promise(const promise& other) = default;
111
113 promise(promise&& other) noexcept = default;
114
116 promise& operator=(const promise& other) = default;
117
119 promise& operator=(promise&& other) noexcept = default;
120
122 bool valid() const {
123 return mImpl != nullptr;
124 }
125
129 promise& then(fl::function<void(const T&)> callback) {
130 if (!valid()) return *this;
131
132 mImpl->set_then_callback(fl::move(callback));
133 return *this;
134 }
135
139 promise& catch_(fl::function<void(const Error&)> callback) {
140 if (!valid()) return *this;
141
142 mImpl->set_catch_callback(fl::move(callback));
143 return *this;
144 }
145
148 void update() {
149 if (!valid()) return;
150 mImpl->update();
151 }
152
154 bool is_completed() const {
155 if (!valid()) return false;
156 return mImpl->is_completed();
157 }
158
160 bool is_resolved() const {
161 if (!valid()) return false;
162 return mImpl->is_resolved();
163 }
164
166 bool is_rejected() const {
167 if (!valid()) return false;
168 return mImpl->is_rejected();
169 }
170
172 const T& value() const {
173 if (!valid()) {
174 static const T default_value{};
175 return default_value;
176 }
177 return mImpl->value();
178 }
179
181 const Error& error() const {
182 if (!valid()) {
183 static const Error default_error;
184 return default_error;
185 }
186 return mImpl->error();
187 }
188
190 void clear() {
191 mImpl.reset();
192 }
193
194 // ========== PRODUCER INTERFACE (INTERNAL USE) ==========
195
197 bool complete_with_value(const T& value) {
198 if (!valid()) return false;
199 return mImpl->resolve(value);
200 }
201
203 if (!valid()) return false;
204 return mImpl->resolve(fl::move(value));
205 }
206
209 if (!valid()) return false;
210 return mImpl->reject(error);
211 }
212
213 bool complete_with_error(const fl::string& error_message) {
214 if (!valid()) return false;
215 return mImpl->reject(Error(error_message));
216 }
217
218private:
221
224};
225
227template<typename T>
231
233template<typename T>
235 return promise<T>::reject(Error(error_message));
236}
237
239template<typename T>
240promise<T> make_rejected_promise(const char* error_message) {
241 return promise<T>::reject(Error(error_message));
242}
243
244// ============================================================================
245// IMPLEMENTATION DETAILS
246// ============================================================================
247
248namespace detail {
249
251enum class PromiseState_t {
252 PENDING, // Promise is still pending
253 RESOLVED, // Promise completed successfully
254 REJECTED // Promise completed with error
255};
256
258template<typename T>
260public:
262
264 void set_then_callback(fl::function<void(const T&)> callback) {
265 mThenCallback = fl::move(callback);
266 // If already resolved, process callback immediately
269 }
270 }
271
273 void set_catch_callback(fl::function<void(const Error&)> callback) {
274 mCatchCallback = fl::move(callback);
275 // If already rejected, process callback immediately
278 }
279 }
280
282 void update() {
283 // Process callbacks if we're completed and haven't processed them yet
286 }
287 }
288
290 bool resolve(const T& value) {
291 if (mState != PromiseState_t::PENDING) return false;
292
293 mValue = value;
295
296 // Process callback immediately if we have one
299 }
300
301 return true;
302 }
303
304 bool resolve(T&& value) {
305 if (mState != PromiseState_t::PENDING) return false;
306
309
310 // Process callback immediately if we have one
313 }
314
315 return true;
316 }
317
319 bool reject(const Error& error) {
320 if (mState != PromiseState_t::PENDING) return false;
321
322 mError = error;
324
325 // Process callback immediately if we have one
328 }
329
330 return true;
331 }
332
334 bool is_completed() const {
336 }
337
339 bool is_resolved() const {
341 }
342
344 bool is_rejected() const {
346 }
347
349 const T& value() const {
350 return mValue;
351 }
352
354 const Error& error() const {
355 return mError;
356 }
357
358private:
362
365
367
370 if (mCallbacksProcessed) return;
371
376 }
377
378 mCallbacksProcessed = true;
379 }
380};
381
382} // namespace detail
383
384} // namespace fl
void process_callbacks()
Process pending callbacks.
Definition promise.h:369
void update()
Update promise state - processes callbacks if needed.
Definition promise.h:282
bool is_completed() const
Check if promise is completed.
Definition promise.h:334
bool resolve(T &&value)
Definition promise.h:304
void set_then_callback(fl::function< void(const T &)> callback)
Set success callback.
Definition promise.h:264
PromiseState_t mState
Definition promise.h:359
bool is_resolved() const
Check if promise is resolved.
Definition promise.h:339
const T & value() const
Get value (only valid if resolved)
Definition promise.h:349
bool reject(const Error &error)
Reject promise with error.
Definition promise.h:319
const Error & error() const
Get error (only valid if rejected)
Definition promise.h:354
bool is_rejected() const
Check if promise is rejected.
Definition promise.h:344
fl::function< void(const T &)> mThenCallback
Definition promise.h:363
fl::function< void(const Error &)> mCatchCallback
Definition promise.h:364
bool resolve(const T &value)
Resolve promise with value.
Definition promise.h:290
void set_catch_callback(fl::function< void(const Error &)> callback)
Set error callback.
Definition promise.h:273
Implementation class for promise - holds the actual state and logic.
Definition promise.h:259
static promise< T > create()
Create a pending promise.
Definition promise.h:75
promise(const promise &other)=default
Copy constructor (promises are now copyable via shared implementation)
const Error & error() const
Get the error (only valid if is_rejected() returns true)
Definition promise.h:181
void update()
Update promise state in main loop - should be called periodically This processes pending callbacks wh...
Definition promise.h:148
bool complete_with_value(const T &value)
Complete the promise with a result (used by networking library)
Definition promise.h:197
promise & catch_(fl::function< void(const Error &)> callback)
Register error callback - returns reference for chaining.
Definition promise.h:139
bool is_resolved() const
Check if promise is resolved (completed successfully)
Definition promise.h:160
promise(promise &&other) noexcept=default
Move constructor.
promise()
Default constructor - creates invalid promise.
Definition promise.h:107
bool complete_with_error(const Error &error)
Complete the promise with an error (used by networking library)
Definition promise.h:208
static promise< T > resolve(const T &value)
Create a resolved promise with value.
Definition promise.h:81
static promise< T > reject(const Error &error)
Create a rejected promise with error.
Definition promise.h:95
bool complete_with_value(T &&value)
Definition promise.h:202
promise(fl::shared_ptr< detail::PromiseImpl< T > > impl)
Constructor from shared implementation (used internally)
Definition promise.h:220
bool is_rejected() const
Check if promise is rejected (completed with error)
Definition promise.h:166
void clear()
Clear promise to invalid state.
Definition promise.h:190
promise & operator=(promise &&other) noexcept=default
Move assignment operator.
bool valid() const
Check if promise is valid.
Definition promise.h:122
bool complete_with_error(const fl::string &error_message)
Definition promise.h:213
const T & value() const
Get the result value (only valid if is_resolved() returns true)
Definition promise.h:172
promise & operator=(const promise &other)=default
Copy assignment operator.
static promise< T > resolve(T &&value)
Create a resolved promise with value (move version)
Definition promise.h:88
static promise< T > reject(const fl::string &error_message)
Create a rejected promise with error message.
Definition promise.h:102
fl::shared_ptr< detail::PromiseImpl< T > > mImpl
Shared pointer to implementation - this allows copying and sharing promise state.
Definition promise.h:223
promise & then(fl::function< void(const T &)> callback)
Register success callback - returns reference for chaining.
Definition promise.h:129
bool is_completed() const
Check if promise is completed (resolved or rejected)
Definition promise.h:154
Promise class that provides fluent .then() and .catch_() semantics This is a lightweight wrapper arou...
Definition promise.h:72
Implements the FastLED namespace macros.
PromiseState_t
State enumeration for promises.
Definition promise.h:251
constexpr remove_reference< T >::type && move(T &&t) noexcept
Definition move.h:27
promise< T > make_resolved_promise(T value)
Convenience function to create a resolved promise.
Definition promise.h:228
shared_ptr< T > make_shared(Args &&... args)
Definition shared_ptr.h:348
promise< T > make_rejected_promise(const fl::string &error_message)
Convenience function to create a rejected promise.
Definition promise.h:234
IMPORTANT!
Definition crgb.h:20
bool is_empty() const
Definition promise.h:60
Error(const char *msg)
Definition promise.h:58
Error(fl::string &&msg)
Definition promise.h:59
Error()=default
Error(const fl::string &msg)
Definition promise.h:57
fl::string message
Definition promise.h:54
Error type for promises.
Definition promise.h:53