From 8a4414e8d5ba629c4643f39df49ca46be3c19851 Mon Sep 17 00:00:00 2001
From: vahid torkaman <vahidlazio@gmail.com>
Date: Fri, 15 Dec 2023 09:28:10 -0500
Subject: [PATCH] make the setting provider awaiting

---
 .../dev/openfeature/sdk/async/Extensions.kt   | 22 +++++++++----------
 README.md                                     | 19 +++++-----------
 2 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt b/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt
index b7792ed..6d0a249 100644
--- a/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt
+++ b/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt
@@ -25,6 +25,14 @@ fun OpenFeatureClient.toAsync(): AsyncClient? {
     }
 }
 
+suspend fun OpenFeatureAPI.setProviderAndAwaitReady(
+    provider: FeatureProvider,
+    dispatcher: CoroutineDispatcher
+) {
+    OpenFeatureAPI.setProvider(provider)
+    provider.awaitReady(dispatcher)
+}
+
 internal fun FeatureProvider.observeProviderReady() = observe<OpenFeatureEvents.ProviderReady>()
     .onStart {
         if (isProviderReady()) {
@@ -32,19 +40,11 @@ internal fun FeatureProvider.observeProviderReady() = observe<OpenFeatureEvents.
         }
     }
 
-suspend fun OpenFeatureAPI.awaitProviderReady(
-    dispatcher: CoroutineDispatcher = Dispatchers.IO
-) {
-    val provider = getProvider()
-    requireNotNull(provider)
-    return provider.awaitProviderReady(dispatcher)
-}
-
-fun OpenFeatureAPI.observeEvents(): Flow<OpenFeatureEvents>? {
-    return getProvider()?.observe()
+inline fun <reified T : OpenFeatureEvents> OpenFeatureAPI.observeEvents(): Flow<T>? {
+    return getProvider()?.observe<T>()
 }
 
-suspend fun FeatureProvider.awaitProviderReady(
+suspend fun FeatureProvider.awaitReady(
     dispatcher: CoroutineDispatcher = Dispatchers.IO
 ) = suspendCancellableCoroutine { continuation ->
     val coroutineScope = CoroutineScope(dispatcher)
diff --git a/README.md b/README.md
index 951708c..9695ec0 100644
--- a/README.md
+++ b/README.md
@@ -75,18 +75,12 @@ This will get a build from the head of the mentioned branch.
 
 ```kotlin
 // configure a provider and get client
-OpenFeatureAPI.setProvider(customProvider)
-val client = OpenFeatureAPI.getClient()
+coroutineScope.launch(Dispatchers.IO) {
+  OpenFeatureAPI.setProviderAndAwaitReady(customProvider)
+  val client = OpenFeatureAPI.getClient()
 
 // get a bool flag value
-client.getBooleanValue("boolFlag", default = false)
-
-// get a bool flag after "ready" signal from provider
-coroutineScope.launch {
-    WithContext(Dispatchers.IO) {
-        client.awaitProviderReady()
-    }
-    client.getBooleanValue("boolFlag", default = false)
+  client.getBooleanValue("boolFlag", default = false)
 }
 ```
 
@@ -163,9 +157,8 @@ Some providers support additional events, such as `PROVIDER_CONFIGURATION_CHANGE
 Please refer to the documentation of the provider you're using to see what events are supported.
 
 ```kotlin
-OpenFeatureAPI.eventsObserver()
-    .observe<OpenFeatureEvents.ProviderReady>()
-    .collect {
+OpenFeatureAPI.observeEvents<OpenFeatureEvents.ProviderReady>()
+    ?.collect {
         // do something once the provider is ready
     }
 ```