/** * SPDX-FileCopyrightText: 2026 Maximiliano Ramirez <maximiliano.ramirezbravo@gmail.com> * * SPDX-License-Identifier: MIT *//** * ReactiveESP32 Example Overview: * - This example demonstrates the use of lazy evaluation in Computed and Effect nodes. * - A Signal holds a numeric value that can be updated via Serial commands. * - A Computed node calculates double the signal's value, but only when accessed (lazy). * - An Effect node logs the computed value when it changes, also using lazy evaluation. * * - The Serial interface is used to interact with the program: * - 'g': Get the current value of the signal and computed. * - 'r': Manually run the effect to log the current computed value. * - 's': Set the signal to a new value. * - 'm': Mutate the signal value by adding 5. * * - Pressing '0' restarts the ESP32. */#include<ReactiveESP32.h>usingnamespaceRxESP32;/* ---------------------------------------------------------------------------------------------- */// Define a simple signalSignal<uint8_t>number(0);// Define a computed doubles the signal value, but with lazy evaluationComputed<uint16_t>doubled([](){uint8_tvalue=number.get();uint16_tresult=value*2;Serial.printf("\t[Computed] Recalculated: %u * 2 = %u\n",value,result);returnresult;},{.lazy=true});// Enable lazy evaluation// Define an effect to log when 'doubled' changes, but with lazy evaluationEffect<>doubled_changed([](){uint16_tvalue=doubled.get();Serial.printf("\t[Effect] 'doubled' value: %u\n",value);returnnullptr;// No cleanup needed},{.lazy=true});// Enable lazy evaluation// Read Serial input and process commandsvoidserialRead();/* ---------------------------------------------------------------------------------------------- */voidsetup(){Serial.begin(115200);delay(1000);Serial.println("=================================");Serial.println("ReactiveESP32 - LazyNodes Example");Serial.println("=================================");// Start the ReactiveESP32 dispatcherif(!Dispatcher::start()){Serial.println("Failed to start ReactiveESP32 Dispatcher!");while(true){delay(1000);}}}voidloop(){serialRead();}voidserialRead(){if(!Serial.available())return;charc=Serial.read();if(c=='\r')return;if(c=='\n')c=' ';Serial.printf("> %c\n",c);switch(c){case'0':{// Restart the ESP32ESP.restart();}break;case'g':{// Get the current value of signal and computedSerial.println("Getting values...");// If computed is dirty, it will recompute on get()if(doubled.isDirty()){Serial.println("\tComputed 'doubled' is dirty, will recompute on get()");}else{Serial.println("\tComputed 'doubled' is clean, using cached value");}uint8_tvalue_number=number.get();uint16_tvalue_doubled=doubled.get();Serial.printf("Number - Doubled: %u - %u\n",value_number,value_doubled);}break;case'r':{// Manually run the effect to log the current doubled valuedoubled_changed.run();}break;case's':{// Set the signal to a new value using set()staticuint8_tnew_value=1;if(!number.set(new_value)){Serial.printf("Number unchanged: %u\n",new_value);break;}Serial.printf("Number set to: %u\n",new_value);new_value++;}break;case'm':{// Mutate the signal value using mutate()number.mutate([](uint8_t&value){value+=5;Serial.printf("Number mutated to: %u\n",value);});}break;}}