// class MyClass
// {
//     using InputEvent = void (*)(const char*); //type aliasing
//                                               //C++ version of: typedef void (*InputEvent)(const char*)
// public:
//     void RegisterCallback(InputEvent InEvent)
//     {
//         Event = InEvent;
//     }
//     void Tick()
//     {
//         //
//         //accumuate buffer here
//         if (true) {
//             //raise event
//             Event(buffer);
//         }
//     }
// private:
//     InputEvent Event;
//     char buffer[10];
// };

// //global callback
// void ProcessData(const char* Data)
// {
//     Serial.println(Data);
// }

// MyClass MClass;

// void setup() {
//   Serial.begin(115200);
//   // put your setup code here, to run once:
//   MClass.RegisterCallback(ProcessData);
// }

// void loop() {
//   // put your main code here, to run repeatedly:
//   MClass.Tick();
// }

uint16_t sum(uint8_t a, uint8_t b) {
   // Serial.print(a+b);
    return a + b;
}
uint16_t mul(uint8_t a, uint8_t b) {
    return a * b;
}
uint16_t arithm_op (uint16_t (*callback_func)(uint8_t, uint8_t),uint8_t a, uint8_t b) {   
    return callback_func(a,b);
}

int F1,F2;
void setup() {
   Serial.begin(115200);
    F2 = arithm_op(mul,4,5); /* Multiplication: 4 x 10*/
    F1 = arithm_op(sum,7,20); /*  Addition: 9 + 5 */
    Serial.println(F1);
    Serial.println(F2);
    
}

void loop(){

}