what's the reasoning behind using sync versions of functions instead of async versions?