Closures are a good way to represent callbacks for non-blocking code. Although C doesn't support closures, you can achieve something similar using structs on the heap, but you can get even better memory efficiency by using JavaScript running on Microvium.